2009-02-27 10 views
7

Soy desarrollador de juegos y actualmente estoy en el proceso de escribir un motor multiplataforma y multiproceso para nuestra empresa. Podría decirse que una de las herramientas más poderosas en un motor de juego es su sistema de scripting, por lo tanto, estoy a la caza de un nuevo lenguaje de scripting para integrarlo en nuestro motor (actualmente usando un motor interno relativamente básico).¿Qué es un buen lenguaje de scripts para integrar en aplicaciones de alto rendimiento?

Las características clave para el sistema de scripting deseado (en orden de importancia) son:

  • Rendimiento - debe ser rápido para llamar & scripts de actualización
  • Cruz plataforma - necesita ser relativamente fácil de portar a múltiples plataformas (no importa un poco de trabajo, pero solo se tarda unos días en llegar a cada plataforma)
  • Compilación sin conexión - Ser capaz de analizar previamente el código de secuencia de comandos sin conexión es casi esencial (ayuda con los tamaños de archivos y la carga) veces)
  • Capacidad para integrarse bien con C++: debe ser capaz de admitir el código OO dentro del idioma e integrar esta funcionalidad con C++
  • Multihebra: no es obligatorio, pero se desea. Lo mejor sería poder ejecutar instancias separadas en múltiples hilos que no interfieran entre sí (es decir, no hay variables globales dentro del código subyacente que deban modificarse durante la ejecución). Las soluciones basadas en Sección crítica y Mutex no necesitan aplicarse.

Hasta ahora he tenido experiencia en la integración/uso de Lua, Squirrel (lenguaje OO, basado en Lua) y he escrito una máquina virtual ActionScript 2.

Entonces, ¿qué sistema de scripting recomienda que se ajuste a los criterios anteriores? (Y si es posible, ¿podría también publicar o enlazar cualquier comparación con otros lenguajes de script que pueda tener)

Gracias, subvención

Respuesta

3

Hemos tenido buena suerte con Squirrel hasta ahora. Lua es tan popular que está en camino de convertirse en un estándar.

Te recomiendo que te preocupes más por la memoria que por la velocidad. La mayoría de los lenguajes de scripting son "lo suficientemente rápidos" y si se vuelven lentos, siempre puedes volver a bajar esa funcionalidad a C++. Sin embargo, muchos de ellos consumen mucha memoria, y en una memoria de consola es un recurso aún más escaso que el tiempo de CPU.El consumo ilimitado de memoria lo bloqueará eventualmente, y si tiene que asignar 4MB solo para el intérprete, es como tener que tirar 30 texturas por la ventana para hacer espacio.

+0

Un buen punto acerca de la memoria, una de nuestras plataformas es la Nintendo DS (sin embargo, podría terminar quedándose con nuestro motor interno para esa plataforma) –

+0

Solo así. Creo que Amaze logró meter a Lua en su motor DS, pero no lo juraría. – Crashworks

+1

En mi dayjob tenemos dos juegos casi terminados de NDS que usan Lua en gran medida. No hay problema, es fácil entrar. – Klaim

7

Lua se han utilizado en la industria de los videojuegos desde hace años. Ligero y eficiente.

Dicho esto, ChaiScript y Falcon son buenos candidatos que coinciden con sus necesidades y con un lenguaje de nivel superior a Lua pero con menos historial y apoyo de la comunidad.

9

Lua tiene la ventaja de ser probado por un número de desarrolladores de videojuegos de renombre y una buena base de desarrolladores expertos gracias a la adopción de Blizzard-Activision como la plataforma principal para desarrollar complementos de World of Warcraft .

7

Lua es un muy buen compañero para sus necesidades. Los tomaré en el mismo orden.

Lua es uno de los lenguajes de scripting más rápidos. Es rápido de compilar y rápido de ejecutar.

Lua compila en cualquier plataforma con un compilador ANSI C, que afaik incluye todas las plataformas de juego.

Lua se puede precompilar, pero como lenguajes muy dinámicos, la mayoría de los errores solo se detectan en tiempo de ejecución. También el código precompilado (como bytecode) suele ser más grande en términos de tamaño que el código fuente.

Hay muchas herramientas de encuadernación Lua/C++.

No admite multithreading (no se puede acceder a una sola instancia del intérprete desde varios subprocesos), pero puede tener varias instancias del intérprete, una por subproceso o incluso una por objeto de juego.

1

de inicio con Python.

Si puede demostrar que necesita más velocidad, mire a Stackless Python. Eso es lo que usa para su juego.

+0

En mi experiencia, la desventaja de Python en un entorno de juego no es la velocidad, sino la cantidad de memoria que consume: el intérprete es voluminoso y come montones ilimitados, mientras que un GC puede quemar todo un marco y todavía no liberas todo. – Crashworks

+0

@Crashworks: estoy seguro de que los desarrolladores de EVE en línea encontrarán esa información útil. Tal vez deberías contactarlos. –

+0

Haré una nota para preguntarle al Sr. Fannar sobre esto en marzo. Para un MMO es un poco diferente porque tiene demasiados recursos en el extremo del servidor y el dispositivo del cliente es una PC, que tiene enormes recursos de memoria. En una consola, si se queda sin memoria, no comienza a paginar y se vuelve lento; simplemente te cuelgas. – Crashworks

2

Lua, y luego LuaJIT por más blaziness!

simplemente no espere demasiado de las bibliotecas automáticas de enlace de C++, la mayoría son lentas y restrictivas. mejor haz tu propia encuadernación para tus propios objetos.

en cuanto a concurrencia, LuaLanes, o haga su propia versión. Si su programa C++ ya está multiproceso, simplemente llame LuaStates por separado de cada hilo, y use sus propias estructuras compartidas en C++ como canales de comunicación si es necesario.

Como ya sabrá, la respuesta que se repite con más frecuencia en Lua es 'hacer las paces', ¡y a menudo es el mejor consejo! excepto cuando se trata de enlaces a bibliotecas comunes de C/C++, en ese caso es bastante probable que ya exista uno.

0

JavaScript puede ser una opción razonable, debido a las montañas de esfuerzo que han ido en la optimización de las diversas implementaciones para su uso en navegadores web.

0

Éstos vienen a la mente:

  • Lua
  • Python con impulso :: pitón
  • MzScheme o Guile
  • rubí con TRAGO
2

Si no ha mirado sin embargo, le sugiero que consulte Angelscript.

Lo he utilizado con éxito en un entorno multiplataforma (Windows y Linux con solo una recompilación) y está diseñado para integrarse bien con C++ (tanto objetos como código).

Es liviano y es compatible con múltiples subprocesos (en el sentido en que se formuló la pregunta), funciona bien y se compila en códigos de bytes que se pueden realizar con anticipación.

Cuestiones relacionadas