7 respuestas

  1. Drazul
    27/09/2011

    Hola buenas.
    LLevo tiempo siguiendo tu blog y queria felicitarte por el gran trabajo que estas haciendo en hacer tutoriales y explicar lo que hace cada clase del BGE.

    Entro a preguntar sobre tu decision de utilizar un array en vez de una pila para las escenas activas. Yo diria que una pila seria mas eficiente en cuanto a cantidad de memoria, al menos en este caso, ya que el pop, ademas de devolvernos la anterior escena activa, elimina de la pila la ultima, por lo que vas recuperando memoria. Por otro lado no se me ocurre ninguna situacion en la que haya tantas escenas en la pila para que sea tan engorroso como dices. Una situacion comun en practicamente todos los juegos y que yo supongo que implementaran con una pila (para almacenar las escenas en pausa) son los menus de juego, por ejemplo:

    -SceneGame
    -SceneMenuPrincipal
    -SceneMenuOpciones
    -SceneMenuVideo

    Ahora mismo esta seria la pila mas grande que se me ocurre que se podria encontrar en un juego.

  2. adrigm
    27/09/2011

    si te fijas, realmente lo que guarda el array no son las escenas en sí, sino un puntero a la escena, es decir, simplemente una dirección de memoria que lo que ocupa es ínfimo. Cuando una escena se elimina del array, el SceneManager se encarga de llamar al método cleanup y al destructor de la escena.

    Una pila lo que vuelve eficiente es la velocidad de acceso, pero como bien dice necesitaríamos una pila de escenas enorme para que se notara algo, buscar en un array de unas 10-15 escenas como mucho no tiene ningún problema de rendimiento.

  3. Lucas
    06/10/2011

    Hola,

    No se si te lo han dicho ya, pero tus enlaces a los ficheros de código no funcionan.
    Enhorabuena tienes un blog muy interesante.

  4. adrigm
    06/10/2011

    Si Lucas, es que he restructurado el engine estoy escribiendo un artículo con los cambios y tengo que cambiar los enlaces, puedes buscar los archivos en la carpeta del repositorio mientras: https://github.com/adrigm/Basic-Game-Engine

  5. Lucas
    19/10/2011

    Hola otra vez y gracias por el link a los ficheros fuente.

    Otra duda que me ha surgido al ver el código es que tienes dos métodos para establecer la escena activa (SetActiveScene y ChangeScene) ¿porque?.

    Gracias y un saludo

  6. adrigm
    20/10/2011

    Lucas, si te das cuenta SetActiveScene es publica y ChangeScene es privada, la que realmente cambia de escena es ChangeScene si lo miras en la implementación, SetActiveScene lo único que hace es cambiar una variable diciendo que la escena necesita ser cambiada, esta variable se comprueba al final del método Loop de la clase App que se encarga de llamar al método ChangeScene. Si te das cuenta App puede acceder al método ChangeScene porque declaramos a App friend de SceneManager que le permite acceder a sus métodos privados.

    ¿Por qué tanto lio y no llamas directamente a ChangeScene? Con esto se evitan los llamados fallos de segmentación, recuerda que en realidad lo unico que cambiamos al cambiar de escena es un punterohacia una dirección u otra, si permitieramos cambiar ese puntero cuando quisiera el usuario del engine posiblemente habrían fallos de memoria. Con este método la perición de cambio se realiza al final del bucle despues de los métodos event, update y draw evitando fallos.

  7. Lucas
    20/10/2011

    Ahh ok, cierto, no me había fijado que en el método SetActiveScene, no cambias el puntero a la escena activa sino una variable que indica la escena a cambiar en cuanto acabe el Loop.

    Otra cosa, porque sacas y metes punteros en la lista inactiva, no seria mas facil tener la lista de todas las escenas cargadas y un int sceneactiva con el indice de la lista de la scene activa, no se si me explico.

Responder

 

 

 

Volver arriba
móvil escritorio