2008-09-15 27 views
25

quiero mover varias partes de mi aplicación en guiones simples, para permitir que las personas que no tienen un gran conocimiento de C++ para poder editar y aplicar diversas características.secuencias de comandos de ejecución en C++ aplicación

Debido a que es una aplicación en tiempo real, tengo que tener algún tipo de multitarea para estos guiones. Idealmente lo quiero para que la aplicación C++ llame a una función de script que luego continúe ejecutándose (bajo el hilo de C++) hasta un punto de pausa (Wait (x)), o retorna. En el caso de que se espere, el estado debe guardarse listo para que el script se reinicie la próxima vez que la aplicación se repita después de que haya expirado la duración.

Las secuencias de comandos también tienen que ser capaces de llamar a C++ métodos de clase, lo ideal es usar el C++ clases en lugar de funciones de contenedor de civil alrededor de clases de C++.

no quiero pasar una enorme cantidad de tiempo de aplicación de la presente, por lo que el uso de un lenguaje de script existente se prefiere a escribir mi propia. Escuché que Python y Lua se pueden integrar en una aplicación de C++, pero no sé cómo hacer esto para lograr mis objetivos.

  • Las secuencias de comandos deben ser capaces de llamar a las funciones C++
  • Las secuencias de comandos deben ser capaces de "pausa" cuando ciertas funciones son llamadas (por ejemplo. Espera), y pueden reiniciar de nuevo por el C++ hilo
  • Necesidades para ser rápido, esto es para una aplicación en tiempo real y podría haber muchos scripts en ejecución.

Probablemente pueda rodar el código multitarea con bastante facilidad, siempre que los scripts se puedan guardar y reiniciar (posiblemente por un hilo diferente al original).

Respuesta

25

Puede usar Lua o Python. Lua es más "liviano" que Python.Tiene una huella de memoria más pequeña que la de python y, en nuestra experiencia, era más fácil de integrar (el kilometraje de las personas en este punto podría variar). Puede admitir un conjunto de scripts que se ejecutan simultáneamente. Lua, al menos, admite detener/iniciar subprocesos de la manera que desee.

Boost.python es agradable, pero en mi experiencia (limitada), nos resultó difícil compilar para nuestros diferentes entornos y era bastante pesado. Tiene (en mi opinión) la desventaja de requerir Boost. Para algunos, eso podría no ser un problema, pero si no necesitas Boost (o no lo estás usando), estás introduciendo una tonelada de código para que Boost.python funcione. YMMV.

Hemos creado Lua en aplicaciones en múltiples plataformas (win32, Xbox360 y PS3). Creo que funcionará en x64. La sugerencia de usar Luabind es buena. Terminamos escribiendo nuestra propia interfaz entre los dos y aunque no es demasiado complicado, tener ese código de pegamento le ahorrará mucho tiempo y tal vez empeoramiento.

Con cualquiera de las dos soluciones, la depuración puede ser un problema. Actualmente no tenemos una buena solución para la depuración de scripts Lua que están integrados en nuestra aplicación. Dado que no hemos usado Python en nuestras aplicaciones, no puedo hablar sobre qué herramientas podrían estar disponibles allí, pero hace un par de años el paisaje era más o menos el mismo: una depuración deficiente. Tener secuencias de comandos para extender la funcionalidad es agradable, pero los errores en los scripts pueden causar problemas y pueden ser difíciles de localizar.

El código Lua en sí es un poco complicado para trabajar si necesita hacer cambios allí. Hemos visto errores en la base de código de Lua que eran difíciles de rastrear. Sospecho que Boost :: Python podría tener problemas similares.

Y con cualquier lenguaje de scripting, no es necesariamente una solución para los "no programadores" para extender la funcionalidad. Puede parecer así, pero es probable que acabe gastando una buena cantidad de tiempo depurando los guiones o incluso Lua.

Dicho todo esto, hemos estado muy contentos con Lua y lo hemos enviado en dos juegos. Actualmente no tenemos planes de alejarnos del idioma. En general, lo hemos encontrado mejor que otras alternativas que estaban disponibles hace un par de años. Python (e IronPython) son otras opciones, pero basadas en la experiencia, parecen ser más duras que Lua. Aunque me encantaría escuchar sobre otras experiencias allí.

+0

¿Cómo es que tienes a Lua trabajando con tus juegos? por ejemplo, cada secuencia de comandos se ejecuta todo el tiempo en su propio subproceso hasta que finaliza, cada secuencia de comandos se maneja como una función (es decir, se ejecuta en la cadena de llamada hasta que vuelve) o como su propio mini-programa (como he descrito anteriormente)? –

+0

Los scripts de Lua se pueden ejecutar en "hilos" y no necesariamente deben manipularse como funciones en línea. Hará lo que quieras. – Mark

+0

Ok. Voy a echar un vistazo más detallado y escribir algunas pruebas para calcular exactamente cómo quiero integrarlo con mi código base :) –

2

Tome un vistazo a la biblioteca Boost.Python. Parece que debería ser bastante sencillo hacer lo que desea.

9

que recomiendo encarecidamente que se tome un vistazo a Luabind. Hace que sea muy simple integrar Lua en tu código C++ y viceversa. También es posible exponer clases completas de C++ para ser usadas en Lua.

3

Definitivamente puede hacer lo que quiera con Python. Here are the docs on embedding Python into an application. Estoy bastante seguro de que Lua también trabajaría, estoy menos familiarizado con eso.

Está describiendo la multitarea cooperativa, donde la secuencia de comandos necesita llamar a una función de Esperar o Esperar periódicamente. Quizás una mejor solución sería ejecutar el lenguaje de scripting en su propio hilo, y luego usar mutexes o colas libres de bloqueo para las interfaces entre el lenguaje de scripting y el resto de su programa. De esta forma, un script con errores que no llame a Break() con la frecuencia suficiente no puede congelar accidentalmente su programa.

5

Su mejor opción es incrustar lua (www.lua.org) o python (www.python.org). Ambos se usan en la industria del juego y ambos acceden a las funciones externas "C" con relativa facilidad, ya que lua tiene una ventaja aquí (porque los tipos de datos son más fáciles de traducir entre lua y C). Interconectarse con objetos C++ será un poco más laborioso para usted, pero puede buscar cómo hacerlo en Google o en foros de discusión de lua o python.

espero que ayude!

+0

Ok, ambos parecen buenos, pero admiten la pausa/reinicio y la forma en que quiero que trabajen con hilos (por ejemplo, utilizando el hilo que llamó al script hasta que retorna o hace una pausa) –

+0

No he usado cualquiera de estos en un entorno enhebrado. Es posible que desee publicar esta pregunta en foros específicos de lua y python. – Kevin

+2

@FireLancer: es probable que esto demore dos años en volver a usarlo en el 2008, pero desde que contestó su pregunta a cualquiera que pueda leer esto hoy: Lua usa corrutinas para hacer lo que usted describe. Puede llamar a "yield()" para pausar una coroutine, y "resume()" para continuar donde lo dejó.Puede pasar parámetros a yield() que se devuelven desde el currículum() anterior, y pasar parámetros a resume() que pasan al rendimiento relevante() que se está reanudando. – SomeCallMeTim

1

También puede incrustar scripts C/C++ usando Ch. Lo he estado usando para un proyecto de juego en el que estoy trabajando, y lo hace bien. Buena combinación de potencia y adaptabilidad.

2

Eche un vistazo a SWIG. Lo he usado para interactuar con Python, pero admite muchos otros lenguajes.

2

Un voto más para Lua. Es pequeño, rápido, no consume mucha memoria (para los juegos su mejor opción es asignar un gran buffer en la inicialización y redirigir todas las asignaciones de memoria Lua allí). Usamos tolua para generar enlaces, pero hay otras opciones, la mayoría mucho más pequeñas/más fáciles de usar (IMO) que boost.python.

2

En cuanto a la depuración de Lua (si sigues esa ruta), he estado usando DeCoda, y no ha sido malo. Pretende ser un IDE, pero no funciona así, pero puede adjuntar el proceso de depuración a Visual Studio y bajar la pila de llamadas en los puntos de ruptura. Muy útil para rastrear ese error.

Cuestiones relacionadas