object pooling es necesario implementarlo?

Publicado por Jeffrey Faper, Abril 19, 2022, 08:11:34 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Jeffrey Faper

en mi juego estoy constantemente creando y destruyendo instancias, como enemigos, balas, explosiones
pensaba que  esa era la manera correcta de hacerlo, pues es lo que te enseñan en los tutoriales de youtube
pero hace poco me tope con esto llamado object pooling,  al parecer crear y destruir instancias genera problemas
de fragmentacion de memoria y en mi juego es evidente ese problema, ya que la memoria de la aplicacion
va aumentando con el tiempo no es algo exagerado pero tal vez en un futuro me podria causar problemas
entonces esta es mi pregunta es necesario implementar object pooling a todos los proyectos o depende del tipo de juego
y de paso como es que se implementa esta tecnica o magia oscura, se que se hace con ds_list pero no se como
gracias por su tiempo!!




Clamud

Tal vez no estás borrando las instancias u otros datos que generas durante la ejecución del juego. Usa el debugger para ver con detalle las instancias.
Para optimizar un poco puedes cambiar algunas instancias por partículas.

Sí me he preguntado cómo hacer object pooling, pero no lo he implementado. Nunca he creado algo en GM que genere muchas instancias, pero sí hice una prueba de plataformero con usa sola instancia.
Una forma de implementar el pooling puede ser esta: Las instancias que no tienen un comportamiento complejo pueden cambiarse por una instancia que guarda los valores en ds_lists o en otras estructuras de datos. Usa loops para ir modificando todas las variables y para dibujar los sprites correspondientes a cada "instancia" personalizada.

Jeffrey Faper

tenia razon, error mio al parecer las surfaces tambien hay que eliminarlas de la memoria.
Deje un tiempo al jugador atascado en una esquina disparando a la nada con un loop de enemigos atacandolo y moviendose por la pantalla
la memoria ya no aumenta mas yupi .

Pero ahora me surgieron otras dudas en un comentario publicado en yoyo.community ingles,
un chico comentaba que al destruir una instancia tambien teniamos que eliminar las variables que creamos en el evento create
por eliminar supongo que se referia a poner cada variable en undefined como por ejemplo sprite_index=undefined; enBehavior=undefined; etc.
Que tan cierto es esto?
Para eso esta el recolector de basura de Game Maker?
pregunto por que nadie le replico su comentario....


Clamud

Las variables simples y los arrays se borran automáticamente.
Pero debes borrar las estructuras de datos que ya no vas a utilizar y ocupan un espacio de memoria independiente de las instancias, como ds_list (y otras ds_*), surfaces, modelos 3D, etc.

somnus

Cita de: Jeffrey Faper en Abril 19, 2022, 08:11:34 AM
en mi juego estoy constantemente creando y destruyendo instancias, como enemigos, balas, explosiones
pensaba que  esa era la manera correcta de hacerlo, pues es lo que te enseñan en los tutoriales de youtube
pero hace poco me tope con esto llamado object pooling,  al parecer crear y destruir instancias genera problemas
de fragmentacion de memoria y en mi juego es evidente ese problema, ya que la memoria de la aplicacion
va aumentando con el tiempo no es algo exagerado pero tal vez en un futuro me podria causar problemas
entonces esta es mi pregunta es necesario implementar object pooling a todos los proyectos o depende del tipo de juego
y de paso como es que se implementa esta tecnica o magia oscura, se que se hace con ds_list pero no se como
gracias por su tiempo!!

en motores donde las instancias son eliminadas con un garbage collector, como en el caso de java, c# y javascript, lo mejor es usar la tecnica de pooling, puesto que se puede llegar al tope del HEAP y por lo tanto desbordarlo, en lenguajes que manejan los objetos directamente como en el caso de C, C++ ( y me parece que GMS 2 en este caso), se puede usar la creacion y destruccion de objetos, como viene tanto en los tutoriales, por lo general esto funciona bien salvo los juegos que usen shaders, surfaces y muchos objetos, lo cual en esos casos si deberias de pensar bien que tecnica utilizar para tener el mejor performace.

Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

somnus

Cita de: Clamud en Abril 26, 2022, 02:54:03 PM
Las variables simples y los arrays se borran automáticamente.
Pero debes borrar las estructuras de datos que ya no vas a utilizar y ocupan un espacio de memoria independiente de las instancias, como ds_list (y otras ds_*), surfaces, modelos 3D, etc.

no necesariamente, si las variables de tipos primitivos son parte de un objeto estas no se borran automaticamente, si no que duran segun el objeto viva o hasta que es destruido o recolectado por el "garbage collector" ( en caso de estar apuntando a null ), los que se borran automaticamente son las variables locales a las funciones pero esto depende tambien como es que funcione el lenguaje.

todas las estructuras de datos: arrays, listas u otros objetos, como lo mencione anteriormente no se borran de memoria hasta que son recolectadas o apuntan a null.
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

Powered by EzPortal
SMF spam blocked by CleanTalk