Tengo un libro de programación de juegos C ++ y tiene una sección Lua. Empecé a leer la sección Lua, y suena interesante, pero no puedo determinar las ventajas y desventajas de usar Lua en mi juego C ++. El único beneficio que puedo pensar actualmente es que puede hacer algunas actualizaciones de codificación, a través de Lua, sin tener que volver a compilar. Aparte de eso, no puedo pensar en nada. ¿Cuáles son las ventajas y desventajas de agregar Lua a un juego de C ++?
Se agradecerían ejemplos.
Respuestas:
No descarte la utilidad de esto tan fácilmente. Usted no entiende lo productivo que será hasta que quitas el paso recompilación.
El "flujo" es un concepto psicológico bastante bien entendido cuando se trata de trabajar. El flujo es esa sensación que tienes cuando estás enfocado en una actividad, cuando estás analizando y resolviendo problemas casi sin pensar, etc. Eres más productivo cuando estás "fluyendo".
Los tiempos de compilación arruinan todo eso. Es difícil mantenerse en el flujo si tiene incluso una compilación de 10 segundos entre probar algo.
Cuando estás desarrollando un juego, lo que generalmente tienes es un "ciclo cerrado". Tienes una idea, codificas una prueba para ver si funciona y luego la pruebas. Si no funciona, modifíquelo e intente nuevamente. El tiempo de "código para probar" es muy importante para mantener el flujo. Conseguir que sea lo más pequeño posible es crucial.
Lo que Lua (o cualquier lenguaje de script incorporado) le permite hacer es probar los cambios, no solo sin "compilar", sino vivir en el juego . Dependiendo de cómo construyas tu juego, puedes ejecutar un comando que reiniciará el juego con nuevos scripts sin tener que parar y volver a cargar datos, etc. No solo no tiene que volver a compilar, no tiene que volver a ejecutarlo.
La capacidad de hacer esto, dado el soporte adecuado del motor, puede aumentar dramáticamente la productividad.
Otro beneficio importante de las secuencias de comandos es la capacidad de no importarles. Si ha pasado mucho tiempo escribiendo C ++, se sorprenderá de cuánto tiempo pasa más de minutos. Donde se borra la memoria. Donde esto se libera. Incluso si está usando en
shared_ptr
todas partes, solo el hecho de escribir todos esos nombres de tipo variable lo ralentiza.En un lenguaje de secuencias de comandos de tipo dinámico, no tiene que preocuparse. El alcance es simple. Las funciones son objetos de primera clase; no tienes que construir functors manualmente. Es muy fácil hacer algunas cosas.
Ahora eso tiene aspectos negativos, si no eres un programador disciplinado. Es muy fácil usar globals en Lua (aunque hay formas de evitarlo). No preocuparse significa que puedes ser muy descuidado cuando codificas.
Pero, de nuevo, ser muy descuidado puede tener ventajas .
Otra ventaja de Lua es que es un buen lenguaje de descripción de datos. Al igual que JSON es solo un archivo JavaScript que crea y devuelve una matriz / tabla, puede crear scripts Lua que devuelvan tablas.
Esto es útil para los archivos de configuración; El formato de tabla de Lua es mucho mejor que los formatos .ini. El formato sigue siendo bastante limpio, compacto y extensible.
Ah, y sigue siendo un script Lua, por lo que puede realizar una lógica real. La desventaja de eso es ... bueno, es un script Lua, por lo que puede realizar una lógica real . Eso podría ser desastroso en el juego, ya que el usuario podría comenzar a arruinar las cosas.
Pero en realidad, esto es fácil de resolver. Lua está diseñado para incrustar, lo que significa que el aislamiento es bastante fácil. De hecho, un nuevo estado de Lua no proporciona nada por defecto; tienes que hacer algo para exponer incluso la más básica de las bibliotecas estándar de Lua. El acceso a los archivos, el acceso al estado del juego, etc., está habilitado, no inhabilitado. Y cada estado Lua está separado el uno del otro. El estado Lua que usa para los scripts AI no tiene que ser el estado Lua que usa para los archivos de configuración.
De hecho, tengo un código que le permite registrar muchas bibliotecas estándar de Lua, pero revisa y elimina todos los archivos IO. En última instancia, lo peor que podría hacer un archivo de configuración basado en un script Lua es hacer que su juego se bloquee inmediatamente al ejecutarlo, quedando sin memoria. Y dado que no está compartiendo estos archivos de configuración manualmente, eso no sería muy divertido para un hacker.
Yo diría que el mayor inconveniente de cualquier lenguaje de script es la depuración. La mayoría de los lenguajes de script no tienen depuradores, y Lua no es diferente. Lua tiene todas las herramientas que uno necesitaría para construir herramientas de depuración. Pero en realidad no tiene un depurador incorporado. Tienes que armar uno. Y eso requerirá un grado razonable de trabajo.
O puede hacerlo con "depuración printf". Realmente depende de cuánto código Lua escribas.
fuente
Donde yo trabajo:
Pros:
luac -l
y echar un vistazo al código de bytes para hacer un análisis; También es bastante fácil analizar la mayoría de los archivos fuente lua, especialmente si tiene una convención de codificación. Podemos hacer cumplir la convención local. También puede buscar metalua para obtener aún más potencia aquí.lua_pcall
.Contras:
step
debería ser cambia drásticamente por juego. Algunos funcionan mejor con GC completo en cada cuadro (conjunto de trabajo pequeño). Algunos funcionan mejor con pases mucho más pequeños con menos frecuencia. Tenga en cuenta que hay mucho trabajo para mejorar el GC en las nuevas versiones de lua y en algunos parches (¡que no debe tener miedo de usar!)lua_State
completo en algunos casos. Y todavía a veces tenemos problemas. Ajustar los tamaños de los grupos de objetos pequeños (son fijos, por simplicidad y menor sobrecarga) y el tamaño del montón de objetos grandes específicos de lua puede ser una molestia. Pero en sistemas de más de 4 MB, todavía no nos hemos molestado con los montones y grupos especializados.__index
y__newindex
). Es mejor si puede detectar errores en tiempo de compilación. Hay varias cosas que puede hacer para aliviar esto.Lua es muy recomendable, ¡solo esté dispuesto a trabajar un poco! También es posible que desee consultar Squirrel , aunque creo que tiene una base de usuarios más pequeña.
fuente
En realidad, hay 3 grandes ventajas:
Estos factores te permiten, como desarrollador de juegos, habilitar funciones que acelerarán el desarrollo y aumentarán la calidad de tu juego.
Por ejemplo:
fuente
Desde mi experiencia, se redujo un poco.
Pros
Contras
Veredicto final, personal: si estás creando un juego de tamaño decente y aún no tienes un lenguaje de script, entonces obtén Lua. Valdrá la pena.
fuente
Garry's Mod es un ejemplo de un juego que usa Lua y C ++. Usan Lua para todos los mods, lo que los hace mucho más fáciles de hacer para las personas. C ++ se usa para todas las partes internas. El único inconveniente que se me ocurre es que Lua no es tan rápido como C ++.
fuente