Asociación de Desarrolladores de Videojuegos Argentina
Julio 30, 2010, 01:52:21 *
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: ADVA tiene nuevo foro!
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Paradigmas, diagramas o arquitecturas para video juegos  (Leído 1034 veces)
danieloso
Usuario
*
Desconectado Desconectado

Mensajes: 95


Ver Perfil
« en: Junio 12, 2008, 08:57:41 »

Hola, me gustaría saber ¿Que paradigmas o arquitecturas existen para el desarrollo de vídeo juegos?.
Es decir, me gustaría saber si exiten patrones de diseño de alto nivel para el desarrollo de un video juego. No se si pudieran mostrar un diagrama de clases o del funcionamiento (aun que sea un pequeño ejemplo).

Considero que por el hecho de que un video juego es más complejo que la mayoria de las aplicaciones de escritorio o servidor, estas aplicaciones (que es a en donde más experiencia tengo) se vería beneficiadas de implementar paradigmas o arquitecturas de video juegos.

Saludos!
« Última modificación: Junio 12, 2008, 09:01:19 por danieloso » En línea
david
Moderador Global
Usuario
*****
Desconectado Desconectado

Mensajes: 1131



Ver Perfil WWW
« Respuesta #1 en: Junio 12, 2008, 11:27:47 »

Los patrones de diseño son los que estan documentados en cualquier libro de patrones, ni mas ni menos.

Como en cualquier desarrollo de soft, no te conviene usar una herramienta sin saber lo que vas a construir. Lo que quiero decir es que no se que paradigma, arquitectura, ni que patron te conviene usar si no se que es lo que queres hacer.

Citar
Considero que por el hecho de que un video juego es más complejo que la mayoria de las aplicaciones de escritorio o servidor
No comparto; hay juegos muy sencillos de hacer y hay algunos complejos, al igual que el desarrollo de "no juegos".
En línea

danieloso
Usuario
*
Desconectado Desconectado

Mensajes: 95


Ver Perfil
« Respuesta #2 en: Junio 13, 2008, 03:36:29 »

Pondré un ejemplo muy sencillo. Tengo un colega que desarrolló un atlas 3d del cuerpo humano.

En su primera versión implementó una programación que podríamos llamar "clásica orientada a objetos" donde tenía que manejar una arquitectura de grano muy fino y muy compleja.

En su segunda versión implementó una arquitectura basada en "managers" que sacó de un libro de video juegos. El resultado fue mucho mas estable, eficiente y humanamente comprensible.
En línea
Varholl
Usuario
*
Desconectado Desconectado

Mensajes: 72



Ver Perfil WWW
« Respuesta #3 en: Junio 13, 2008, 09:24:59 »

Amigo,

Como estas?? Excelente pregunta la tuya, asi como ya dijo David, no siempre se sabe que arquitectura utilizar para este tipo de desarrollos, algunos son video juegos mas simples que con una arquitectura mas "rustica" funcionan perfectamente y acomplejar la arquitectura no tiene sentido. En otros juegos la arquitectura es mucho mas compleja, pero por lo general para este tipo de juegos mas "complejos" se utiliza el patron MVC, quizas lo conozcas pero para los que no significa "Model, View, Controller". para mas informacion... dirijanse a este link http://en.wikipedia.org/wiki/Model-view-controller

Espero a ver sido de ayuda!!
En línea

blog de desarrollo: www.varholl.com.ar/blog
El Hombre Gris
Usuario
*
Desconectado Desconectado

Mensajes: 130


True Believer


Ver Perfil
« Respuesta #4 en: Junio 13, 2008, 09:42:07 »

El patrón MVC fue pensado y se maneja muy bien para hacer arquitecturas de GUI front-ends para aplicaciones empresariales de escritorio. EL MVC para videojuegos queda chico. El MVC para hacer aplicaciones sobre un web server HTTP es tratar de poner un clavo con un destornillador, sin importar cuantos "rubíes" tenga el mango.

----

Supongo que no importa un carajo lo que diga, realmente lo que pone comida en mi plato no son los juegos, más bien algo que me gusta hacer para olvidar los ABMs, pero bueh me toco hacer un videojuego para una materia de la facu y como soy purista, intente diseñar una arquitectura afín. Tal vez lo que hice te sirve de algo. El juego a hacer era un típico arcade de plataformas.

La arquitectura la dividi en dos capas: un nucleo y un frente. El nucleo es el juego en sí (game layer), y el frente es la interfaz humana que podía ser la interfaz del jugador (player layer) o la del editor de niveles (editor layer). La idea era que tanto la aplicación final del juego como la aplicación interna para que el que se encargaba de hacer los niveles compartieran el mismo core, garantizando, en teoría, que el level-designer tuviera una previsualización acorde, y se reutilizara todo el código que era pertinente.

El core, o game layer, lo dividí en 4 subsistemas: Gameplay, Render, Action y World (de ahí que le quedo el nickname de patrón GRAW Cheesy).

El subsistema World era la simulación del espacio de juego: como se abstraía un nivel y cada uno de los actores del juego. La emulación de la física de este espacio formaba parte de este subsistema como un componente subordenado al mismo.

El subsistema Render se encargaba de presentar el espacio de juego en forma audio visual. Tomaba el estado actual de World (porque World guardaba dos estados: el estado actual y el estado futuro) y según esto actualizaba el display, y generaba efectos sonoros, o cambiaba la música de fondo.

Además este subsistema exponía interfases a algo que llame "rendering hints", que se acoplaban a ciertos elementos de World, y servían para añadir información que el render necesitaba pero que no hacía a la abstracción del espacio de juego. Por ejemplo, en ese juego los niveles estaban abstraídos como una grilla de tiles, y un tile podía estar vacío pero tener diferentes motivos decorativos; a la simulación del mundo no le importa si el fondo es una pared o empapelado, pero al render sí porque tiene que mostrar assets diferentes; el asset a usar estaba indicado en los rendering hints.

No importa como lo implementes, lo importante de este punto es que las entidades del subsistema World deben poder acoplar información de Render sin saber realmente de que se trata, ya que es información que ajusta el aspecto visual pero no cambia en nada la simulación del mundo.

En el subsistema Action modele las diferentes interacciones del juego, por ejemplo el hacer caminar en una dirección dada al personaje. Lo importante acá es desacoplar "lo que se puede hacer" del "como se lo indica a través de los dispositivos de entrada", o sea, en el Action no hay noción de que existe un teclado o un mouse, solo nociones de "hacer mover al personaje", "activar un objeto", etc. Como se mapean estas acciones a los dispositivos de teclado y mouse es preocupación de la capa superior.

En el subsistema Gameplay es donde modele la mecánica del juego, las reglas que lo rigen. En el caso particular de ese juego la mecánica era básicamente una máquina de estado, por eso es que World guardaba dos estados, una presente y uno futuro. Gameplay construía el estado futuro a partir del estado presente, observando en Action cuales son las interacciones pendientes.

Además, hacía uso del componente de simulación de física de World para generar el siguiente paso siguiendo las reglas "físicas" que regían la simulación. Salvo que la física juegue un papel importante en la mecánica, me pareció más pertinente que formara parte del subsistema World.

Luego se hacia "avanzar el tiempo" reemplazando el estado presente por el estado futuro.

----

El sistema funcionaba básicamente de esta manera:

El player layer seteaba el display y lo vinculaba con Render.

En la sincronía con el frame delegaba a Render la tarea del... render, y luego rendereaba el HUD observando World (por ejemplo, observando la vida restante del personaje principal y dibujando la barrita de vida).

Un reloj manejaba el ritmo de juego, el cual delegaba cada "paso" del juego a Gameplay.

La interacción con teclado y mouse era atendida también en el player layer, asociada con una acción pertinente en Action, y, por ejemplo, si acción requería estar asociada a un elemento del juego que fuera marcado por el mouse, se le preguntaba primero a Render que había en dicha posición (ya que Render es el que sabe como se relaciona la presentación con la abstracción).

----

Al final, en general te puedo decir que ordenarlo así le dió algo de coherencia al código, a grano grueso y a grano fino, así que dentro de todo tuvo sus buenos resultados, pero tal vez con otros tipos de juegos no funcione tan bien.... que se yo. Por lo menos me sirvió para sacarme una muy buena nota para esa materia, aún con un producto no terminado (funcional pero no terminado). Intente usar la arquitectura para otro juego (quise hacer algo para codear banner games) pero estoy hasta las manos de laburo y solo se me complica un montón. A pesar de eso me sirvió para arrancar con algo totalmente nuevo sin arrancar de cero.

Igual estuve pensando como plantear esta arquitectura para otros tipos de juegos y/o con otros conjuntos de features, como por ejemplo ver donde meter la IA (que en realidad puede pisar en diferentes partes de la arquitectura), o como agregar un subsistema adicional Story para juegos que manejen una narrativa muy entrelazada con la mecánica, o un sistema Networking para la sincronización y resolver problemas de juegos multiplayer sobre un enlace de comunicación no fiable, etc, etc.

Igual insisto que lo que más sé es sobre software fuera del ámbito de los videojuegos. Para mí los videojuegos son un hobby (tal vez algún día lo haga una profesión pero será bajo mis propios términos). Así que tomalo con pinzas sabiendo que viene de alguien que te saca ABMs como pizza.
En línea
danieloso
Usuario
*
Desconectado Desconectado

Mensajes: 95


Ver Perfil
« Respuesta #5 en: Junio 16, 2008, 07:30:57 »

Conozco el MVC, pero la verdad a veces siento que es un paradigma demasiado abstracto. Es como decir "programación orientada a objetos". El patrón o paradigma encierra tantos retos que la interpretación e implementación es radicalmente distinta dependiendo quien la implemente.

Les muestro algunos diagramas que he encontrado en la red que (según mi interpretación) son un especie de MVC "adaptado" al modelo de eventos de un motor de vídeo juego.

http://www.fiu.edu/~jmarr002/html/images/Diagrams/BasicGameArchitecture.jpg
http://www.thecheapcostume.com/CaptainNStuff/gameModel.jpg
http://cs.anu.edu.au/student/comp2110/resources/Encounter-SDD/high-level/RPGFramework.GIF

En lo personal mi "paradigma" es un conjunto de clases o "managers" que me permiten agrupar la funcionalidad en un contexto "humanamente manejable".

Para la comunicación entre componentes utilizo "conectores" que traducen trasmiten los eventos y parámetros de un componente a otro. Eso me permite integrar componentes propios o de terceros con relativa facilidad. La desventaja que le veo a este "paradigma" es el rendimiento. Al utilizar capas intermedias se pierde eficiencia en tiempo de ejecución.

Un ejemplo muy concreto de los managers que uso es el "LoaderManager" en lugar de tener la programación tan pulverizada y tener el objeto imagen, audio, video, mesh, etc., cada uno con sus respectivos métodos de carga, prefiero agrupar todo en un solo manager que carga cualquier tipo de objeto, me reporta el estatus y me regresa la referencia del objeto una vez cargada.
En línea
Sergio J. de los Santos
Usuario
*
Desconectado Desconectado

Mensajes: 444


Ver Perfil
« Respuesta #6 en: Junio 17, 2008, 11:27:53 »

Hace un tiempo encontré un patrón de diseño conocido como Entity System y la verdad es que me pareció muy piola. La idea básica es que hay entidades, componentes y sistemas. Todo aquello que esta en el mundo (y otras cosas que no) es una entidad. Una entidad en si misma no hace nada. La funcionalidad se la dan los componentes y sus sistemas asociados. De esta forma una entidad queda definida por sus componentes. Cada componente tiene un sistema asociado que es el que procesa este componente (un componente es por así decirlo solo un conjunto de atributos).

En mi proyecto actual estoy usando mucho este paradigma. Originalmente pensé usarlo solo para GamePlay, pero la verdad es muy útil para muchas otras áreas como integración con motores de física, render, etc.

Dejo un par de links de referencias:

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/

Saludos,
En línea
Bernardo
Usuario
*
Desconectado Desconectado

Mensajes: 475


Ver Perfil
« Respuesta #7 en: Junio 18, 2008, 11:30:44 »

Gracias por las refencias
En línea
danieloso
Usuario
*
Desconectado Desconectado

Mensajes: 95


Ver Perfil
« Respuesta #8 en: Junio 18, 2008, 02:07:15 »

Está muy interesante ese último patrón que comentaron...  Impresionado
En línea
DJ_JIA
Usuario
*
Desconectado Desconectado

Mensajes: 248


ilMare Games


Ver Perfil WWW
« Respuesta #9 en: Junio 18, 2008, 03:03:21 »

Otro patron de diseño util es el State[1] para controlar los distintos estados del juego.
Basicamente consiste en encapsular cada estado del juego en un objeto.

En mi experiencia, para proyectos grandes, con muchos estados, simplifica mucho la lectura del codigo ademas de simplificar tareas comunes a todos los estados (manejo de logica, de input, de paint, etc). Tambien permite reutilizar estados para otros proyectos (los splashes del inicio, algunos main menues, etc)

En proyectos chicos, en vez de simplificar, aumenta la complejidad innecesariamente, por lo que veo mejor tener la tipica estructura basada en un switch:

switch(estado)
{
    case MAIN_MENU:
    ...
    break;
    case INGAME:
    ...
    break;
    case GAME_OVER:
    ...
    break;
    ...
}

Saludos

[1] http://es.wikipedia.org/wiki/State_(patr%C3%B3n_de_dise%C3%B1o)
« Última modificación: Junio 19, 2008, 02:03:39 por DJ_JIA » En línea

d1360h
Usuario
*
Desconectado Desconectado

Mensajes: 16



Ver Perfil WWW
« Respuesta #10 en: Junio 19, 2008, 06:41:28 »

Interesante...
   respecto de los patrones Entity y State, por lo que veo, son compatibles y no excluyentes, cierto?. Debido a que el state, en este caso apunta a los estados del juego y el Entity al estado o composición de las entidades del juego.

   Algo que se puede agregar a la utilización del patrón State y que me está resultando bastante útil ultimamente es lo siguiente:

    Tomando cada estado del juego como un objeto y teniendo claro cuales son las condiciones que me hacen pasar de un estado a otro, puedo tratar a mi juego como una máquina de estados finitos: Por ejemplo, sé que si el jugador está en el estado MENU_PRINCIPAL y clickea o presiona enter sobre la opción JUGAR, entonces debe pasar al estado JUGANDO.
   
    De esta forma, se podría programar una aplicación sencilla que dados los estados de un juego y las condiciones para pasaje entre estados, genere el esqueleto de código necesario para los estados de nuestro juego.

    NOTAR que no resuelve nada de lógica de gameplay sino que define el flujo de ejecución de la aplicación (video juego).

Saludos,
D.
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!