Lenguajes, Garbage collector y videojuegos

Ayer un lector del blog dejó un comentario en mi artículo: 15 aspectos críticos en la programación de videojuegos, consultando sobre los problemas de utilizar lenguajes de programación que incorporan Garbage collector en el desarrollo de videojuegos. Concretamente, me preguntó lo siguiente:

dario90: Hola, podrias hablar mas sobre los problema de los Garbage Collector en lso videojuegos?? porque dicen que no es aconsejable usar lenguajes que tengan incorporado GC para hacer videojuegos.

gracias

Aunque le dejé la respuesta como un comentario en el referido post, me pareció conveniente hacer un pequeño artículo para aquellas personas que puedan tener la misma inquietud.

¿Por qué dicen que no es aconsejable usar lenguajes que tengan incorporado Garbage Collector en los videojuegos?

No es que no sean aconsejables. Por ejemplo, nuestro más reciente videojuego DragonScales: Chamber of the Dragon Whisperer, fue desarrollado en Java, un lenguaje de programación que utiliza garbage collector. Simplemente hay que tener cuidado, sobre todo en videojuegos para dispositivos móviles. En estos lenguajes con garbage collection es muy fácil olvidarse o desconocer la naturaleza de la creación de objetos, lo que luego puede ocasionar lentitud o incluso crashes del juego. Por ejemplo, si en cada frame lees la posición de un objeto y creas un objeto Vector para almacenar dicha posición, terminarás con centenares de objetos Vector, que luego, en algún momento, tendrán que ser recolectados. Cuando llegue ese momento, tu juego muy probablemente se enlentecerá o quedará paralizado por un instante. Lo recomendable en ese caso es crear una sola instancia de Vector y reutilizarla en cada frame.

Escenaseleccionniveleslastdribbble

Por otro lado, tienes que estar seguro de que cada objeto que crees puede luego ser recolectado por el garbage collector, es decir, tienes que conocer bien las librerías que estés usando. Puede ocurrir que alguna librería que uses cree un objeto que no pueda ser recolectado automáticamente (por ejemplo, objetos almacenados en “native heap memory”), y por tanto te corresponde a ti liberarlo explícitamente. En tal caso, si olvidas liberar el objeto o lo reutilizas mal puedes terminar con memory leaks o crashes. En resumen, con cualquier lenguaje, con o sin garbage-collection, debes ser cuidadoso.

Espero que esta información les sea de ayuda ^^