Hasta ahora la arquitectura de red que me he planteado es muy simple, una arquitectura cliente-servidor utilizando la librería de red ENet (parte del motor libre "Cube" y "Cube 2") pudiendo verse en marcha en el videojuego Sauerbraten.
Mi decisión principal ha sido separar el motor de físicas al lado del servidor lo cual me evita el engorro de sincronizar el motor de física de todos los clientes, para pasar a sincronizar unicamente las posiciones/orientaciones calculadas por el servidor.
Pero hagamos unos calculos para comprobar la viabilidad del sistema. Vamos a centrarnos en la subida del servidor que es donde se centra el cuello de botella del tráfico del juego.
Supongamos una conexión normal/baja de hoy día que soporte 512Kbps de subida. A este servidor se conectarán hasta digamos 16 personas.
512 Kbps * 1024 / 8 = 65.536 Bytes por segundo.
65.536 Bps / 16 clientes = 4096 Bps / persona
Tenemos 4KB de información para enviar a cada cliente por segundo, en esos 4KB debemos incluir toda la información de los demás clientes y la suya incluida, y deberemos mandar un número constante de reportes cada segundo, digamos 30.
4096 Bps / 16 clientes / 30 reportes = 8,5 Bps en cada paquete de datos.
Una posición x,y,z son 3 float y una orientación puede medirse como mínimo con 3 variables (la direccion de la normal), con lo cual minimo en esos reportes necesitamos enviar 6 float, que como minimo pueden ocupar 2 bytes cada uno. 6 float * 2 Bytes = 12 Bytes necesarios como mínimo.
Mi conclusión es o que en algo me estoy equivocando en los cálculos o sincronizar los clientes a tiempo real cada frame no es la solución.
De momento solo se me ocurre que en vez de sincronizar continuamente la posición/orientación etc, solo se sincronicen eventos entre los clientes, pero eso implica que las físicas esten en todos los clientes y sean deterministas, para que no se ejecuten diferente en ningún cliente.
Mostrando entradas con la etiqueta Proyectos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Proyectos. Mostrar todas las entradas
Project Caelum: GUI y NET
GUI
Bueno, hace mucho que no cuento nada por aquí. La verdad es que no hay mucho que decir, he añadido el interfaz de usuario del menú principal. Ahí dejo un screenshot.
NET
También he tocado un poco el tema de red y los tipos de conexión necesarios, que se ejecutará en el servidor y el cliente etc. pero aún estoy en pruebas.
De momento estoy con la parte "fácil": hacer el chat. La interfaz ya está hecha y la parte de red casi terminada también, hice un test con un chat de consola y funcionaba perfecto, ahora solo añadirlo al proyecto.
La parte importante la que lleva el juego, sigo en dudas ya que las físicas del juego en red me plantean muchos interrogantes.
Problema: si las físicas deben ejecutarse en cada cliente y sincronizarse por el servidor o solo ejecutarse en el servidor. En el primer caso las físicas deben ser deterministas, es decir, los factores aleatorios no pueden alterar la ejecución.
Solución ideal: Creo que la opción ideal consiste en ejecutar principalmente las físicas en el servidor y las físicas de cada personaje en el cliente de modo que la conexión no impida a un cliente su movimiento fluido. Sin embargo intentar ejecutar las físicas "por cachos" me parece un locura ahora mismo.
Solución escogida: Las físicas se ejecutarán en el servidor y los clientes se sincronizaran con el servidor central.
Bueno, hace mucho que no cuento nada por aquí. La verdad es que no hay mucho que decir, he añadido el interfaz de usuario del menú principal. Ahí dejo un screenshot.
NET
También he tocado un poco el tema de red y los tipos de conexión necesarios, que se ejecutará en el servidor y el cliente etc. pero aún estoy en pruebas.
De momento estoy con la parte "fácil": hacer el chat. La interfaz ya está hecha y la parte de red casi terminada también, hice un test con un chat de consola y funcionaba perfecto, ahora solo añadirlo al proyecto.
La parte importante la que lleva el juego, sigo en dudas ya que las físicas del juego en red me plantean muchos interrogantes.
Problema: si las físicas deben ejecutarse en cada cliente y sincronizarse por el servidor o solo ejecutarse en el servidor. En el primer caso las físicas deben ser deterministas, es decir, los factores aleatorios no pueden alterar la ejecución.
Solución ideal: Creo que la opción ideal consiste en ejecutar principalmente las físicas en el servidor y las físicas de cada personaje en el cliente de modo que la conexión no impida a un cliente su movimiento fluido. Sin embargo intentar ejecutar las físicas "por cachos" me parece un locura ahora mismo.
Solución escogida: Las físicas se ejecutarán en el servidor y los clientes se sincronizaran con el servidor central.
Sistema de terreno (viejo vs nuevo)
Empiezo a pensar si de verdad merece la pena utilizar el sistema de terreno actual para crear los mapas ya que usa un metodo "antiguo" que no provee de capacidad para generar las sombras del terreno sobre si mismo (solo a traves de shaders).
En resumen:
En resumen:
- Con el sistema antiguo...
- Tendría un terreno paginado (es decir de unas dimensiones enormes, sin mayor coste) y vegetación animada etc.
- El mapa no genera sombras sobre sí mismo (p.e. las montañas no generarán sombras) pero si puedo conseguir fácilmente que el terreno en general se oscurezca/aclare a la luz de dia/noche y que reciba las sombras de otros objetos.
- El rendimiento es mas rápido aún con shaders.
- Adoptando el nuevo sistema...
- Tendria un terreno con paginación (mediante otro sistema) y reacción a sus propias sombras aunque tardan unos segundos en generarse
- Me evitaria tener que programar yo los shaders pero con un sistema de terreno mucho mas complicado de implementar.
- No tendría vegetación y para obtenerla tendría que cambiar el código al nuevo sistema.
- El rendimiento es bastante lento.
Project-Caelum: soporte para cmake y codigo reestructurado.
Bueno hacia bastante tiempo que no actualizaba esto. Lo cierto es que apenas si he tocado el proyecto, mas que nada por las vacaciones que me he pegado la verdad XD han estado genial la verdad ^^. La cuestión es que a cuenta de la pereza y las vacaciones pues no he tocado nada del proyecto así que tampoco había mucho que decir la verdad.
De momento el único cambio significativo que hay es que he añadido soporte para cmake al código, lo cual me ha facilitado bastante las cosas a la hora de reestructurar el código y me ayudará bastante también supongo a la hora de compilarlo para windows. Eso sí, ahora mismo el proyecto es como si hubiera dado un paso atrás y no hace nada. Me he dado cuenta que bastantes cosas importantes las había hecho sin pensar y a lo rápido con el entusiasmo de ver como quedaba, pero para nada ofrecía la flexibilidad que necesita el proyecto.
Aún faltan muchas cosas por hacer pero de momento lo imprescindible es:
De momento el único cambio significativo que hay es que he añadido soporte para cmake al código, lo cual me ha facilitado bastante las cosas a la hora de reestructurar el código y me ayudará bastante también supongo a la hora de compilarlo para windows. Eso sí, ahora mismo el proyecto es como si hubiera dado un paso atrás y no hace nada. Me he dado cuenta que bastantes cosas importantes las había hecho sin pensar y a lo rápido con el entusiasmo de ver como quedaba, pero para nada ofrecía la flexibilidad que necesita el proyecto.
Aún faltan muchas cosas por hacer pero de momento lo imprescindible es:
- volver a programar los controladores de los personajes y sus respectivas habilidades
- integrar el sistema de paginación con el motor de físicas,
Recuperando mi ordenador... poco a poco
Bueno ya he conseguido el último código y el media que tenia de project-caelum. He compilado el ultimo ogre y bullet, con soporte para threads esta vez.
Esta vez he compilado tambien los plugins como librerías dinámicas e intentaré cargarlos a través del sistema de plugins de Ogre, que me parece mas conveniente. Sin embargo antes de esto, para poder reestructurar el código como he diseñado y no tener que tirarme horas para ir cambiando el makefile me estoy planteando el soporte para cmake y así también me será mas fácil el port a windows cuando toque.
Esta vez he compilado tambien los plugins como librerías dinámicas e intentaré cargarlos a través del sistema de plugins de Ogre, que me parece mas conveniente. Sin embargo antes de esto, para poder reestructurar el código como he diseñado y no tener que tirarme horas para ir cambiando el makefile me estoy planteando el soporte para cmake y así también me será mas fácil el port a windows cuando toque.
Recompilando
Hace cosa de un mes formateé el portátil y hasta día de hoy aun no tenia nada puesto, ahora mismo acabo de compilar Ogre 1.7.1 y Bullet 2.76, pero también tendré que volver a recompilar la librería estática que hice para SkyX (la hice estática para no comerme la cabeza al linkarla) y otra para la geometría paginada y claro está volver a recompilar el proyecto.
Edit: Igual mejor compilarla en una librería dinámica y cargarla como plugin a través de Ogre.
Ya he pensado unos cuantos cambios para reorganizar un poco la estructura de Project-Caelum así que espero tener algo de tiempo libre para hacerlo, aun así sigo sin tener ninguna idea que me convenza para el sistema de peleas, tan solo para el de hechizos... pero bueno algo se me ocurrirá ;)
Edit: Igual mejor compilarla en una librería dinámica y cargarla como plugin a través de Ogre.
Ya he pensado unos cuantos cambios para reorganizar un poco la estructura de Project-Caelum así que espero tener algo de tiempo libre para hacerlo, aun así sigo sin tener ninguna idea que me convenza para el sistema de peleas, tan solo para el de hechizos... pero bueno algo se me ocurrirá ;)
Project-Caelum: Tendrá que esperar un poco
Últimamente me estaba costando un poco expandir nuevas funcionalidades y no me convence la flexibilidad de lo que hay hecho hasta el momento, además hay muchas cosas que han sido programadas un poco "on the fly" según salían y creo que está un poco chapucero la verdad. Así que estoy en planes de rediseñar todo el motor del juego y planearlo un poco más antes de ponerme a programarlo, para que pueda ser totalmente extendible. La idea es que cuando la codificación del proyecto esté terminada, siga siendo extendible mediante nuevos personajes e incluso nuevos ataques para cada uno etc. lo cual me hace rediseñar todo el código si quiero llegar a buen puerto.
Además a parte de todo esto me estoy centrando en el nuevo blender 2.5 al cual han cambiado bastante el GUI pero que también parece mas profesional y estoy aprendiendo nuevas técnicas de animación y sobre todo de rigging. En este caso es importante que aprenda bien todo esto sobre diseño 3D ANTES de realizar nada definitivo por que una vez realizados las mallas esqueletos texturizados rigging y animaciones realizar un mínimo cambio en alguna de las etapa supondría una cantidad de trabajo enorme e innecesaria si es posible evitarla.
Además a parte de todo esto me estoy centrando en el nuevo blender 2.5 al cual han cambiado bastante el GUI pero que también parece mas profesional y estoy aprendiendo nuevas técnicas de animación y sobre todo de rigging. En este caso es importante que aprenda bien todo esto sobre diseño 3D ANTES de realizar nada definitivo por que una vez realizados las mallas esqueletos texturizados rigging y animaciones realizar un mínimo cambio en alguna de las etapa supondría una cantidad de trabajo enorme e innecesaria si es posible evitarla.
Project Caelum: de vuelta al trabajo…
Llevo bastante tiempo sin programar nada entre el "descanso" de exámenes y demás, pero parece que vuelven las ganas de hacer algo nuevamente.
El tema del plugin SkyX está totalmente integrado ya en el proyecto aunque aun hay cierto bug por resolver en SkyX sobre la luna, (es una pena, porque es preciosa) pero bueno, ahí no puedo hacer nada, no es competencia mía. El otro plugin, de geometría paginada, supongo que será mi siguiente paso, a ver si a partir de ahí ya tengo una forma de crear entornos y escenarios básicos y me puedo concentrar en el algoritmo de reconocimiento de gestos y en la estructura del juego sobre los hechizos de magia de los personajes y ya se puede ir haciendo algo jugable.
Humm... De momento estoy aún a falta de buenas ideas sobre un sistema de peleas (melee) que me convenza, igual es que le pido demasiado pero debería ser muy dinámico y permitir peleas extremadamente rápidas, en las que halla que hacer acopio de todos nuestros reflejos, pero en los que los controles sean medianamente intuitivos y se dependa de la propia habilidad del jugador para ganar el combate, en lugar de su nivel o personaje. Aun así, evidentemente, cada personaje dispondrá de diferentes cualidades, y será mas dado a la magia o al combate cuerpo a cuerpo.
Intentaré crear un nuevo video para enseñar el progreso en cuanto tenga el siguiente plugin a punto también ;)
El tema del plugin SkyX está totalmente integrado ya en el proyecto aunque aun hay cierto bug por resolver en SkyX sobre la luna, (es una pena, porque es preciosa) pero bueno, ahí no puedo hacer nada, no es competencia mía. El otro plugin, de geometría paginada, supongo que será mi siguiente paso, a ver si a partir de ahí ya tengo una forma de crear entornos y escenarios básicos y me puedo concentrar en el algoritmo de reconocimiento de gestos y en la estructura del juego sobre los hechizos de magia de los personajes y ya se puede ir haciendo algo jugable.
Humm... De momento estoy aún a falta de buenas ideas sobre un sistema de peleas (melee) que me convenza, igual es que le pido demasiado pero debería ser muy dinámico y permitir peleas extremadamente rápidas, en las que halla que hacer acopio de todos nuestros reflejos, pero en los que los controles sean medianamente intuitivos y se dependa de la propia habilidad del jugador para ganar el combate, en lugar de su nivel o personaje. Aun así, evidentemente, cada personaje dispondrá de diferentes cualidades, y será mas dado a la magia o al combate cuerpo a cuerpo.
Intentaré crear un nuevo video para enseñar el progreso en cuanto tenga el siguiente plugin a punto también ;)
Project Caelum: Sistema de Hechizos y Gestos
Antes de entrar en detalles, primero tengo que explicar el porqué de esto.
Creo haber dicho que me gustaría que el sistema de combates de Project-Caelum sea muy dinámico y se base casi completamente en la habilidad del jugador y en sus reflejos. Así pues, me ha parecido una forma interesante asociar la evocación de conjuros a diferentes dibujos o trazos. Me explico, al entrar en modo evocación (o cast) podremos dibujar con el ratón un trazo el cual quedará reflejado en la pantalla en forma de "halo" o trazo de luz, y si el trazo está formado correctamente y está asociado a un hechizo, este se ejecute. De esta forma quedará patente la habilidad del jugador para realizar los hechizos, mediante la rapidez y posiblemente la calidad o no del trazo ( si se parece mucho podría recibir mas potencia, y si por el contrario la forma dibujada dista mucho de cualquiera, podrían aplicarse efectos adversos) aunque esto ultimo no tiene prioridad por el momento.
2.-Este método permite hacer mas complicados, los hechizos mas potentes, es decir podemos asignar trazos sencillos a hechizos comunes, y trazos muy complicados y costosos a hechizos mas potentes.
3.-Se puede determinar la complejidad de un trazo matemáticamente, ya sea por la complejidad en si misma del trazo, o variando el nivel de similitud necesario a alcanzar. Esto mismo puede permitir crear un sistema en el cual cada jugador puede fijar los trazos asignados a cada hechizo, y el sistema decidirá si cumple la complejidad mínima para dicho hechizo.
La idea
Creo haber dicho que me gustaría que el sistema de combates de Project-Caelum sea muy dinámico y se base casi completamente en la habilidad del jugador y en sus reflejos. Así pues, me ha parecido una forma interesante asociar la evocación de conjuros a diferentes dibujos o trazos. Me explico, al entrar en modo evocación (o cast) podremos dibujar con el ratón un trazo el cual quedará reflejado en la pantalla en forma de "halo" o trazo de luz, y si el trazo está formado correctamente y está asociado a un hechizo, este se ejecute. De esta forma quedará patente la habilidad del jugador para realizar los hechizos, mediante la rapidez y posiblemente la calidad o no del trazo ( si se parece mucho podría recibir mas potencia, y si por el contrario la forma dibujada dista mucho de cualquiera, podrían aplicarse efectos adversos) aunque esto ultimo no tiene prioridad por el momento.
Halibidad real = habilidad in-game
2.-Este método permite hacer mas complicados, los hechizos mas potentes, es decir podemos asignar trazos sencillos a hechizos comunes, y trazos muy complicados y costosos a hechizos mas potentes.
3.-Se puede determinar la complejidad de un trazo matemáticamente, ya sea por la complejidad en si misma del trazo, o variando el nivel de similitud necesario a alcanzar. Esto mismo puede permitir crear un sistema en el cual cada jugador puede fijar los trazos asignados a cada hechizo, y el sistema decidirá si cumple la complejidad mínima para dicho hechizo.
FtS: Video presentación de personajes
Con motivo de la presentación que hemos tenido que ofrecer en la universidad al entregar Freedom to Smash como nuestro proyecto de MCT (Multimedia Computing Technology) tengo un video para enseñaros que hice como presentación de los personajes de FtS ;)
Project Caelum: añadiendo plugins
Bueno de momento tengo un sistema bastante básico de animaciones funcionando, y aunque aún no he comenzado con el sistema de cámaras (quizás debería...) he estado echando un vistazo a un par de plugins para añadir al proyecto; uno sobre simulación de cielo, y otro de geometría paginada ( heightmap, densisty maps) etc...
- Simulación de cielo (ciclos día/noche)
- Geometría paginada
Con este he tenido un par de problemas puesto que la versión de mercurial de Ogre ya no soporta la función "setWorldGeometry" con lo cual el plugin de geometría paginada no funcionaba...
- Próximamente
Project Caelum: sistema de animaciones
Actualmente estoy de exámenes asi que no tengo mucho tiempo para mis proyectos, pero ahora mismo estoy pensando en el sistema de animaciones y de pelea de forma que sea totalmente expandible y permita que cada personaje pueda tener habilidades y modos de ataque diferentes.
He hecho un esquema básico sobre el sistema de animación y no deberia tomarme mucho tiempo, a ver si despues de hacer esto rehago el sistema de control de la cámara y empiezo ya con algo mas interesante... control de gestos o algún melee básico para que vaya siendo un poco mas jugable.
He hecho un esquema básico sobre el sistema de animación y no deberia tomarme mucho tiempo, a ver si despues de hacer esto rehago el sistema de control de la cámara y empiezo ya con algo mas interesante... control de gestos o algún melee básico para que vaya siendo un poco mas jugable.
Ideas pendientes…
Bueno, como todo proyecto, comienza por una idea, y como todos los que alguna vez hemos querido hacer un proyecto, ideas tenemos y a patadas :-P (por desgracia, demasiadas como para poder cumplir con todas). Aun así hay ciertas cosas que me gustaría hacer y que me parecen muy interesantes, entre ellas implementar...
- Algoritmo de detección de gestos
- Algoritmo "pathfinding"
- Algún tema de realidad aumentada
- También algo de conectividad móvil.
Project Caelum: Video
Bueno parece que project-caelum ultimamente va avanzando.
Por el momento ya hay una base hecha con Ogre OIS y OpenAL que espero no necesite muchos cambios, y acabo de integrar recientemente Bullet para las físicas.
Aunque aún queda bastante por hacer, mejorar las fisicas, reconocimiento de gestos, sistemas de particulas, rayscene queries, CEGUI...
Por el momento ya hay una base hecha con Ogre OIS y OpenAL que espero no necesite muchos cambios, y acabo de integrar recientemente Bullet para las físicas.
Aunque aún queda bastante por hacer, mejorar las fisicas, reconocimiento de gestos, sistemas de particulas, rayscene queries, CEGUI...
Comenzamos!
Bienvenidos a mi blog!
Me llamo David, y soy un estudiante de ingeniería informática. Puesto que mis proyectos empiezan a aumentar de tamaño (mayormente videojuegos, o al menos un intento :P), he creído oportuno crear un blog para comentar los progresos que voy haciendo así como cualquier noticia referente o de ayuda.
Actualmente mis proyectos son:
- F.O.G. [Proyecto en Grupo] http://www.fog3d.org
Comenzamos a realidad este juego hará ya 2 años, pero lo abandonamos pasado poco tiempo, debido a que el abundante trabajo que requería y los conocimientos necesarios, se nos escapaban de las manos. Este juego prometía mucho, pretendía ser un juego en 3d muy dinámico, estilo prince of persia con multiples combos y mucha libertad de movimiento, escenarios abiertos... vamos, que era una locura! Aun así gracias mayormente a uno de nuestros componentes (Jonan Ander Peñalba) conseguimos tener un motor básico (OGRE y OIS) y físicas (sin softbodies) (Bullet) pero nunca llegó a mas.
- Freefate [Proyecto Personal] http://sourceforge.net/projects/freefate
Este es un proyecto personal que realizé en 2º de carrera para la asignatura de "Tecnología de Programación". Es un juego muy simple en 2.5D estilo diablo, en el cual menajas a un muñeco gris (creado en blender) y con el cual debes derrotar a todos los demas personajes de la pantalla, mediante el uso de ciertas habilidades (melee, bolas de fuego, autocuración y escudo mágico). Actualmente no he seguido desarrollando ese juego, puesto que mi objetivo era aprender el funcionamiento básico interno de un juego.
- Freedom to Smash [Proyecto en Grupo]
Este proyecto lo estamos realizando este año (2010) entre 4-6 personas, para la asignatura de MCTP (Multimedia Computing Technology Program) ó TIM para los de castellano (Tecnología Informática Multimedia). Se trata de un clon libre del juego de nintendo64 Super Smash Brosh.
Este es el proyecto personal en el que actualmente estoy "trabajando". Se trata de un juego en 3D en el que me centraré en un sistema de combate de acción totalmente nuevo centrado sobre todo en combates rápidos y dinámicos. Actualmente los juegos con esta característica tienden a volverse muy simplistas y acaban convirtiendose en un mero aporreo de botones, por eso me gustaría primar la habilidad y los reflejos del jugador para responder a los ataques. Pero ya se verá como avanza todo esto... deseadme suerte.
Suscribirse a:
Entradas (Atom)