Pregunta

Quiero mover varias partes de mi aplicación a scripts simples, para permitir que las personas que no tienen un conocimiento sólido de C++ puedan editar e implementar varias funciones.

Como es una aplicación en tiempo real, necesito tener algún tipo de multitarea para estos scripts.Idealmente, lo quiero para que la aplicación C++ llame a una función de secuencia de comandos que luego continúe ejecutándose (bajo el subproceso C++) hasta un punto de pausa (Esperar (x)) o regrese.En caso de que esté en espera, 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.

Los scripts también deben poder llamar a métodos de clases de C++, idealmente usando las clases de C++ en lugar de funciones contenedoras simples alrededor de las clases de C++.

No quiero dedicar una gran cantidad de tiempo a implementar esto, por lo que es preferible utilizar un lenguaje de programación existente a escribir el mío propio.Escuché que Python y Lua se pueden integrar en una aplicación C++, pero no sé cómo hacerlo para lograr mis objetivos.

  • Los scripts deben poder llamar funciones de C++.
  • Los scripts deben poder "pausarse" cuando se llaman ciertas funciones (por ejemplo.Espere) y el hilo de C ++ lo reiniciará nuevamente.
  • Debe ser rápido: esto es para una aplicación en tiempo real y es posible que se estén ejecutando muchos scripts.

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

¿Fue útil?

Solución

Puedes usar Lua o Python.Lua es más "ligero" que Python.Tiene una huella de memoria más pequeña que Python y, según nuestra experiencia, fue más fácil de integrar (el conocimiento de las personas en este punto puede variar).Puede admitir varios scripts ejecutándose simultáneamente.Lua, al menos, admite detener/iniciar subprocesos de la manera que desee.

Boost.python es bueno, pero en mi (limitada) experiencia, 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 puede no ser un problema, pero si no necesita Boost (o no lo está usando), está introduciendo una tonelada de código para que Boost.python funcione.YMMV.

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

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

Es un poco complicado trabajar con el código Lua en sí si es necesario realizar cambios allí.Hemos visto errores en el código base de Lua que fueron difíciles de localizar.Sospecho que Boost::Python podría tener problemas similares.

Y con cualquier lenguaje de scripting, no es necesariamente una solución para que los "no programadores" amplíen la funcionalidad.Puede que lo parezca, pero probablemente terminarás dedicando una buena cantidad de tiempo a depurar scripts o incluso quizás a Lua.

Dicho todo esto, estamos muy contentos con Lua y lo hemos incluido en dos juegos.Actualmente no tenemos planes de alejarnos del idioma.Considerándolo todo, lo encontramos mejor que otras alternativas que estaban disponibles hace un par de años.Python (y IronPython) son otras opciones, pero según la experiencia, parecen más duros que Lua.Aunque me encantaría conocer otras experiencias allí.

Otros consejos

Te recomiendo encarecidamente que eches un vistazo a Luabind.Hace que sea muy sencillo integrar Lua en su código C++ y viceversa.También es posible exponer clases completas de C++ para usarlas en Lua.

Lo mejor que puede hacer es incorporar lua (www.lua.org) o python (www.python.org).Ambos se utilizan en la industria de los juegos y ambos acceden a funciones externas "C" con relativa facilidad, teniendo lua una ventaja aquí (porque los tipos de datos son más fáciles de traducir entre lua y C).La interfaz con objetos C++ requerirá un poco más de trabajo por su parte, pero puede buscar cómo hacerlo en Google o en los foros de discusión de lua o python.

¡Espero que eso ayude!

Definitivamente puedes hacer lo que quieras con Python. Aquí están los documentos sobre cómo incorporar Python en una aplicación. Estoy bastante seguro de que Lua también funcionaría, sólo que estoy menos familiarizado con él.

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

Échale un vistazo al Impulso.Python biblioteca.Parece que debería ser bastante sencillo hacer lo que quieras.

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

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

En cuanto a depurar Lua (si sigues ese camino), he estado usando DeCoda y no ha estado mal.Pretende ser un IDE, pero falla en eso, pero puede adjuntar el proceso de depuración a Visual Studio y bajar la pila de llamadas en los puntos de interrupción.Muy útil para rastrear ese error.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top