"No optimizar temprano" no significa "elegir la peor forma posible de hacer las cosas". Aún debe tener en cuenta las implicaciones de rendimiento (a menos que solo esté creando prototipos). El punto no es paralizar otras cosas más importantes en ese punto del desarrollo, como la flexibilidad, la confiabilidad, etc. Elija optimizaciones simples y seguras: elija las cosas que limita y las que mantiene libres; realizar un seguimiento de los costos. ¿Deberías usar tipeo fuerte? La mayoría de los juegos funcionaban y funcionaban bien; ¿cuánto le costaría eliminar eso si encuentra usos interesantes de la flexibilidad para gamemplay?
Es mucho más difícil modificar el código optimizado, especialmente el código "inteligente". Siempre es una elección que hace que algunas cosas sean mejores y otras peores (por ejemplo, podría estar cambiando el tiempo de CPU por el uso de memoria). Al tomar esa decisión, debe ser consciente de todas las implicaciones: pueden ser desastrosas, pero también pueden ser útiles.
Por ejemplo, Commander Keen, Wolfenstein y Doom fueron construidos sobre un motor de renderizado optimizado. Cada uno tenía su "truco" que permitía que el juego existiera en primer lugar (cada uno también tenía más optimizaciones desarrolladas con el tiempo, pero eso no es importante aquí). Eso está bien . Está bien optimizar en gran medida el núcleo del juego, la idea que lo hace posible; especialmente si estás explorando un nuevo territorio donde esta característica optimizada en particular te permite considerar diseños de juegos que no fueron muy explorados. Las limitaciones que introduce la optimización también pueden brindarle un juego interesante (por ejemplo, los límites de conteo de unidades en los juegos RTS pueden haber comenzado como una forma de mejorar el rendimiento, pero también tienen un efecto de juego).
Pero tenga en cuenta que en cada uno de estos ejemplos, el juego no podría existir sin la optimización. No comenzaron con un motor "completamente optimizado", comenzaron con la simple necesidad y avanzaron. Desarrollaban nuevas tecnologías y las usaban para hacer juegos divertidos. Y los trucos del motor se limitaron a una parte tan pequeña de la base de código como sea posible: las optimizaciones más pesadas solo se introdujeron cuando el juego se realizó en su mayoría, o cuando permitió que surgiera una nueva característica interesante.
Ahora considera un juego que tal vez quieras hacer. ¿Existe realmente algún milagro tecnológico que haga o rompa ese juego? Tal vez estás imaginando un juego de mundo abierto en un mundo infinito. ¿Es realmente la pieza central del juego? ¿El juego simplemente no funcionaría sin él? Tal vez estás pensando en un juego donde el terreno es deformable sin límite, con una geología realista y tal; ¿Puedes hacer que funcione con un alcance más pequeño? ¿Funcionaría en 2D en lugar de 3D? Obtenga algo divertido lo antes posible, incluso si las optimizaciones pueden requerir que modifique una gran parte de su código existente, puede valer la pena; e incluso te darás cuenta de que hacer las cosas más grandes realmente no mejora el juego.
Como ejemplo de un juego reciente con muchas optimizaciones, señalaría Factorio. Una parte crítica del juego son los cinturones: hay muchos miles de ellos y llevan muchos trozos individuales de materiales por toda la fábrica. ¿Comenzó el juego con un motor de correa altamente optimizado? ¡No! De hecho, el diseño original del cinturón era casi imposible de optimizar: hacía una simulación física de los elementos del cinturón, lo que creaba algunas cosas interesantes que podía hacer (esta es la forma en que obtiene un juego "emergente", un juego que sorprende el diseñador), pero significaba que tenía que simular cada elemento del cinturón. Con miles de correas, obtienes decenas de miles de elementos simulados físicamente, incluso solo quitándolos y dejando que las correas hagan el trabajo te permiten reducir el tiempo de CPU asociado en un 95-99%, incluso sin considerar cosas como la localidad de memoria. Pero solo es útil hacerlo cuando realmente alcanzas esos límites.
Casi todo lo que tenía que ver con los cinturones tuvo que rehacerse para permitir que los cinturones se optimizaran. Y los cinturones necesitaban ser optimizados, porque necesitabas muchos cinturones para una gran fábrica, y las grandes fábricas son una atracción del juego. Después de todo, si no puedes tener grandes fábricas, ¿por qué tener un mundo infinito? Es curioso que preguntes: las versiones anteriores no lo hicieron :) El juego fue reelaborado y remodelado muchas veces para llegar a donde están ahora, incluida una nueva versión del 100% cuando se dieron cuenta de que Java no es el camino a seguir para juego como este y se cambió a C ++. Y funcionó muy bien para Factorio (aunque todavía era algo bueno, no estaba optimizado desde el principio, especialmente porque se trataba de un proyecto de pasatiempo, que podría haber fallado simplemente por falta de interés).
Pero la cosa es, no sonPuedes hacer muchas cosas con una fábrica de alcance limitado, y muchos juegos han demostrado eso. Los límites pueden ser aún más motivadores para la diversión que las libertades; ¿Sería más divertido Spacechem si los "mapas" fueran infinitos? Si comenzaste con "cinturones" muy optimizados, te verías obligado a seguir ese camino; y no podría explorar otras direcciones de diseño (como ver qué cosas interesantes puede hacer con cintas transportadoras simuladas por la física). Estás limitando tu potencial espacio de diseño. Puede que no parezca así porque no ves muchos juegos sin terminar, pero la parte difícil es hacer la diversión correcta: por cada juego divertido que ves, probablemente haya cientos que simplemente no pudieron llegar y fueron descartados (o peor, lanzado como desorden horrible). Si la optimización lo ayuda a hacerlo, continúe. Si no es así ... Es probable que sea prematuro. Si crees que una mecánica de juego funciona muy bien, pero necesita optimizaciones para brillar realmente, adelante. Si no tienes una mecánica interesante,No los optimices . Encuentra la diversión primero: encontrarás que la mayoría de las optimizaciones no ayudan con eso, y a menudo son perjudiciales.
Finalmente, tienes un gran juego divertido. ¿Tiene sentido optimizar ahora ? ¡Decir ah! Todavía no está tan claro como podría pensar. Hay algo divertidopuedes hacer en su lugar? No olvides que tu tiempo aún es limitado. Todo requiere un esfuerzo, y desea centrar ese esfuerzo en donde más importa. Sí, incluso si estás haciendo un "juego gratis" o un juego de "código abierto". Mira cómo se juega el juego; observe dónde el rendimiento se convierte en un cuello de botella. ¿La optimización de esos lugares es más divertida (como construir fábricas cada vez más grandes y enredadas)? ¿Le permite atraer a más jugadores (por ejemplo, con computadoras más débiles o en diferentes plataformas)? Siempre debe priorizar: busque la relación esfuerzo / rendimiento. Es probable que encuentres mucha fruta baja simplemente jugando tu juego y viendo a otros jugar el juego. Pero tenga en cuenta la parte importante: para llegar allí, necesita un juego . Concéntrate en eso.
Como guinda, considera que la optimización nunca termina. No es una tarea con una pequeña marca de verificación que finaliza y pasa a otras tareas. Siempre hay "una optimización más" que puede hacer, y una gran parte de cualquier desarrollo es comprender las prioridades. No optimiza por el bien de la optimización, lo hace para lograr un objetivo particular (por ejemplo, "200 unidades en la pantalla a la vez en un Pentium de 333 MHz" es un gran objetivo). No pierda la noción del objetivo terminal solo porque se concentra demasiado en los objetivos intermedios que tal vez ya no sean requisitos previos para el objetivo terminal.