¿Qué debería aprender un desarrollador de motores de videojuegos?

En el pasado GameLab, y más allá de las charlas de grandes gurús explicando sus batallitas, también fue posible asistir a ponencias más de tipo orientación para aquellos interesados en dedicarse al mundo del desarrollo de videojuegos. Todas eran muy interesantes, pero quizá la que más me llamó la atención  por su título fue la ofrecida por Mike Acton, director de motores (Engine Director) en Insomniac Games, creadores de sagas con tanta solera como Spyro o Ratchet & Clank (de éste último hay hasta una película de animación relativamente reciente). La ponencia llevaba el título “Process I wish they taught engine programmers in school” (Procesos que desearía que enseñaran a programadores de motores en la escuela). Un tema interesante no solo para los estudiantes, sino toda una llamada a los propios docentes. Su punto de partida era el hecho que, una vez tras otra, se encontraba que desde que un nuevo miembro se incorporaba a su equipo hasta que estaba listo para valerse por si mismo pasaban al menos dos años en los que debía ser formado. Desde su punto de vista, este problema venía dado por algunas costumbres o prácticas de programación que se enseñan en las escuelas técnicas o de ingenierías, que si bien sobre el papel o en una gran cantidad de proyectos funcionan, para la programación de  motores de videojuegos deben ser corregidas. El meollo del asunto según su punto de vista es que a menudo tendemos a sobrecomplicar las cosas bajo la justificación de la escalabilidad. Se nos plantea un problema y enseguida hacemos API’s o capas de abstracción que permitan resolver ese problema…...

Optimización de código: un código más eficiente

En los primeros tiempos de la informática, programar exigía utilizar lenguajes muy próximos a la plataforma de ejecución. El código máquina o el lenguaje ensamblador permiten un control muy fino del proceso de ejecución: cómo se asignan los registros del procesador, cómo se almacenan los datos y se accede a la memoria, … Así es posible exprimir la máxima eficiencia de una plataforma, aunque el precio a pagar es la falta de portabilidad y el mayor coste de desarrollo y mantenimiento del código. Afortunadamente, hoy en día podemos utilizar lenguajes de programación de alto nivel, que abstraen estos detalles de la plataforma y nos permiten ser más productivos resolviendo problemas más complejos en menos tiempo. Sin embargo, con esta transición hemos perdido algo de eficiencia… ¿o no? Quizás tampoco tanta, porque los compiladores incorporan técnicas que permiten mejorar el rendimiento del código generado. La optimización de código es el conjunto de fases de un compilador que transforman un fragmento de código en otro fragmento con un comportamiento equivalente y que se ejecuta de forma más eficiente, es decir, usando menos recursos de cálculo como memoria o tiempo de ejecución. Es importante destacar que: La condición de tener un “comportamiento equivalente” es bastante onerosa, ya que incluye también situaciones de error donde el comportamiento debe ser el mismo. Pongamos como ejemplo una instrucción como “x = y / y“. La tentación es substituir esta expresión por “x =1“, pero es necesario garantizar que la variable y no puede ser igual a 0, porque entonces el código podría tener un comportamiento diferente según el lenguaje (p.ej. división por cero). También es fundamental garantizar que el código no será menos eficiente...