Unas dudas sobre los estados

Consulte acerca de programas, técnicas, algoritmos etc.

Unas dudas sobre los estados

Notapor carleto » Jue Oct 06, 2011 10:59 am

Hola

Me picó un poco la curiosidad sobre lo que se habla de los estados en el enlace que pone carlostex en esta conversación: viewtopic.php?f=9&t=1279

Así que estuve mirando el código. Hay algo que no me queda claro. En el gameengine, el método que se encarga de cambiar de estado es el siguiente:

void CGameEngine::ChangeState(CGameState* state) 
{
// cleanup the current state
if ( !states.empty() ) {
states.back()->Cleanup();
states.pop_back();
}

// store and init the new state
states.push_back(state);
states.back()->Init();
}


Según entiendo lo que hace es sacar de la lista el último estado (que sería el que está actualmente ejecutándose) y meter e iniciar el nuevo.

En el mismo ejemplo, el Init() de un estado es así:
void CMenuState::Init()
{
SDL_Surface* temp = SDL_LoadBMP("menu.bmp");

bg = SDL_DisplayFormat(temp);

SDL_FreeSurface(temp);

printf("CMenuState Init\n");
}


Por lo tanto, cada vez que se cambia de estado, se recargan las imágenes ¿No supondría esto una pérdida de rendimiento? Este ejemplo es sencillo, pero en un juego completo imagino que sí, habría que cargar esas imágenes en otra parte.

Y otra cosa, si, por ejemplo, yo creo un estado que es el juego en sí, y otro que es un menú que puede aparecer durante el juego y al salir del menú quiero que el juego esté dónde lo dejé. Si lo hago así, se reiniciaría a cada vez. Imagino que habría que hacer como comenté con las imágenes, iniciar el juego en otra parte.

No sé si estoy en lo cierto con lo que comento, a ver si me aclaráis.

Saludos
std::cout << "Usuario registrado de Linux Nº 504222" << std::endl;
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España

Re: Unas dudas sobre los estados

Notapor kiketom » Jue Oct 06, 2011 11:15 am

carleto escribió:Hola

Me picó un poco la curiosidad sobre lo que se habla de los estados en el enlace que pone carlostex en esta conversación: viewtopic.php?f=9&t=1279

Así que estuve mirando el código. Hay algo que no me queda claro. En el gameengine, el método que se encarga de cambiar de estado es el siguiente:

void CGameEngine::ChangeState(CGameState* state) 
{
// cleanup the current state
if ( !states.empty() ) {
states.back()->Cleanup();
states.pop_back();
}

// store and init the new state
states.push_back(state);
states.back()->Init();
}


Según entiendo lo que hace es sacar de la lista el último estado (que sería el que está actualmente ejecutándose) y meter e iniciar el nuevo.

En el mismo ejemplo, el Init() de un estado es así:
void CMenuState::Init()
{
SDL_Surface* temp = SDL_LoadBMP("menu.bmp");

bg = SDL_DisplayFormat(temp);

SDL_FreeSurface(temp);

printf("CMenuState Init\n");
}


Por lo tanto, cada vez que se cambia de estado, se recargan las imágenes ¿No supondría esto una pérdida de rendimiento? Este ejemplo es sencillo, pero en un juego completo imagino que sí, habría que cargar esas imágenes en otra parte.


En efecto el codigo hace lo que dices. Propuse esa gestión de estados del juego como un ejemplo. Pero perfectamente podrías cargar los recursos en la Clase que gestiona los estado gamemanager.py y luego usarlos en el estado que desees con self.parent.recurso .
No se si me he explicado correctamente :P


carleto escribió:Y otra cosa, si, por ejemplo, yo creo un estado que es el juego en sí, y otro que es un menú que puede aparecer durante el juego y al salir del menú quiero que el juego esté dónde lo dejé. Si lo hago así, se reiniciaría a cada vez. Imagino que habría que hacer como comenté con las imágenes, iniciar el juego en otra parte.

No sé si estoy en lo cierto con lo que comento, a ver si me aclaráis.
Saludos


Para hacer eso en el estado del juego tendrias que llamar a pushState(menuState) para que dejara el estado del juego en "pause" y luego en menuState hacer un popState().
Avatar de Usuario
kiketom
 
Mensajes: 82
Registrado: Lun Ene 03, 2011 3:01 pm
Ubicación: Valencia, España

Re: Unas dudas sobre los estados

Notapor kiketom » Jue Oct 06, 2011 12:01 pm

Aqui tienes un pequeño ejemplo:

http://www.box.net/shared/1axt5mir3yl1hir50ytl
Avatar de Usuario
kiketom
 
Mensajes: 82
Registrado: Lun Ene 03, 2011 3:01 pm
Ubicación: Valencia, España

Re: Unas dudas sobre los estados

Notapor carleto » Vie Oct 07, 2011 9:40 am

kiketom escribió:Aqui tienes un pequeño ejemplo:

http://www.box.net/shared/1axt5mir3yl1hir50ytl


Le he estado echando un vistazo, aunque yo uso C++, entiendo que la idea es la misma.

Se me ha ocurrido una modificación al código original que puse. Quitar las llamadas a iniciar y a limpiar en los métodos que meten, quitan o cambian a un nuevo estado. Y entonces hacer la iniciación de todos los estados al iniciar el motor y limpiar todos los estados al cerrar el motor.

La pega que se me ocurre es, a parte del código extra, es que se están creando e iniciando todos los estados posibles, aunque luego durante la ejecución lo los vayamos a usar todos, en un juego complejo, con muchos estados, sería un "desperdicio" de memoria y tiempo.

Creo que lo mejor será crear una clase que se encargue de cargar/liberar los gráficos y demás e ir iniciando/liberando los estados a medida que se necesiten.

Saludos
std::cout << "Usuario registrado de Linux Nº 504222" << std::endl;
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España

Re: Unas dudas sobre los estados

Notapor carlostex » Sab Oct 08, 2011 1:20 am

carleto escribió:Creo que lo mejor será crear una clase que se encargue de cargar/liberar los gráficos y demás e ir iniciando/liberando los estados a medida que se necesiten.


Tu idea esta bien, ya que estas usando una clase que solo maneja gráficos, y estas especializando las clases, para el mantenimiento del código eso es muy bueno. Por otro lado en el ejemplo esta así por que el objetivo es dar una estructura de como manejar estado, no de como cargar los recursos eso es cosa aparte.
En este sentido hay que equilibrar, pues si se cargan todas las imágenes que se usaran durante el juego, este usara mucha memoria. en juegos 2D no representa ni un problema cargar las imágenes al momento que se requieres, además estados del juego no son muchos, pues mas bien son como menús, ni el juego mas complicado que conozco usa muchos menús, otra cosas es que el juego contenga muchos niveles pero eso es otra cosa y todo juego carga sus recursos antes de iniciar el nuevo nivel(el típico loading...). en mi opinion no creo que sea tan necesario preocuparse por si va a tardar en cargar a cada rato los estados una pantalla puede ocupar 2 Mg eso de bolada lo cargas desde el disco duro.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Unas dudas sobre los estados

Notapor carleto » Lun Oct 10, 2011 8:34 am

carlostex escribió:... en juegos 2D no representa ni un problema cargar las imágenes al momento que se requieres, además estados del juego no son muchos, pues mas bien son como menús, ni el juego mas complicado que conozco usa muchos menús, otra cosas es que el juego contenga muchos niveles pero eso es otra cosa y todo juego carga sus recursos antes de iniciar el nuevo nivel(el típico loading...). en mi opinion no creo que sea tan necesario preocuparse por si va a tardar en cargar a cada rato los estados una pantalla puede ocupar 2 Mg eso de bolada lo cargas desde el disco duro.


Toda la razón carlostex, sobre todo en el juego que yo haga, que suelen ser muy muy simples y sencillitos :wink:

Más que nada preguntaba por curiosidad :D


Saludos
std::cout << "Usuario registrado de Linux Nº 504222" << std::endl;
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado