Question

Je souhaite déplacer différentes parties de mon application dans des scripts simples, afin de permettre aux personnes ne connaissant pas bien c ++ de pouvoir éditer et mettre en œuvre diverses fonctionnalités.

Comme il s'agit d'une application en temps réel, j'ai besoin d'une sorte de multitâche pour ces scripts. Idéalement, je le veux pour que l'application c ++ appelle une fonction de script qui continue à s'exécuter (sous le thread c ++) jusqu'à ce qu'un point de pause (Wait (x)) soit renvoyé. Dans le cas d'une attente, l'état doit être enregistré afin que le script puisse être redémarré lors de la prochaine boucle de l'application après l'expiration de sa durée.

Les scripts doivent également pouvoir appeler des méthodes de classe c ++, idéalement à l'aide des classes c ++ plutôt que des fonctions de wrapper simples autour des classes c ++.

Je ne veux pas passer énormément de temps à mettre cela en œuvre. Il est donc préférable d’utiliser un langage de script existant plutôt que d’écrire le mien. J'ai entendu dire que Python et Lua peuvent être intégrés dans une application c ++, mais je ne sais pas comment faire cela pour atteindre mes objectifs.

  • Les scripts doivent pouvoir appeler des fonctions c ++
  • Les scripts doivent pouvoir "mettre en pause". lorsque certaines fonctions sont appelées (par exemple, Wait) et sont redémarrées par le thread c ++
  • Il faut être rapide - c'est pour une application en temps réel et il pourrait potentiellement y avoir beaucoup de scripts en cours d'exécution.

Je peux probablement rouler assez facilement le code multitâche, à condition que les scripts puissent être enregistrés et redémarrés (éventuellement par un autre thread que l'original).

Était-ce utile?

La solution

Vous pouvez utiliser Lua ou Python. Lua est plus "léger" que python. Son empreinte mémoire est inférieure à celle de python et, selon notre expérience, il était plus facile de l'intégrer (le kilométrage parcouru par les gens sur ce point peut varier). Il peut prendre en charge plusieurs scripts s'exécutant simultanément. Lua, au moins, prend en charge l’arrêt / le démarrage des threads comme vous le souhaitez.

Boost.python est bien, mais dans mon expérience (limitée), il était difficile pour nous d’obtenir une compilation pour nos différents environnements et était assez lourd. Il a (à mon avis) l'inconvénient d'exiger Boost. Pour certains, ce n'est peut-être pas un problème, mais si vous n'avez pas besoin de Boost (ou ne l'utilisez pas), vous introduisez une tonne de code pour que Boost.python fonctionne. YMMV.

Nous avons intégré Lua à des applications sur plusieurs plates-formes (win32, Xbox360 et PS3). Je crois que cela fonctionnera sur x64. La suggestion d'utiliser Luabind est bonne. Nous avons fini par écrire notre propre interface entre les deux et bien que cela ne soit pas trop compliqué, avoir ce code collé vous fera gagner beaucoup de temps et peut-être une aggravation.

Avec l'une ou l'autre solution, le débogage peut s'avérer difficile. Nous n'avons actuellement aucune bonne solution pour déboguer les scripts Lua intégrés à notre application. Comme nous n'avons pas utilisé python dans nos applications, je ne peux pas vous dire quels outils pourraient être disponibles là-bas, mais il y a quelques années, le paysage était à peu près le même: un débogage médiocre. Avoir des scripts pour étendre les fonctionnalités est bien, mais des bogues dans les scripts peuvent causer des problèmes et peuvent être difficiles à localiser.

Le code Lua lui-même est assez compliqué à utiliser si vous devez y apporter des modifications. Nous avons constaté des problèmes difficiles à détecter dans la base de code Lua elle-même. Je pense que Boost :: Python pourrait avoir des problèmes similaires.

Et quel que soit le langage de script utilisé, ce n'est pas forcément une solution pour les "non-programmeurs". étendre la fonctionnalité. Cela peut sembler être le cas, mais vous passerez probablement beaucoup de temps à déboguer des scripts ou même peut-être Lua.

Cela dit, nous sommes très satisfaits de Lua et l’avons expédié dans deux jeux. Nous n'avons actuellement pas l'intention de nous éloigner de la langue. Dans l’ensemble, nous l’avons trouvé meilleur que les autres solutions proposées il ya quelques années. Python (et IronPython) sont d’autres choix, mais en se basant sur l’expérience, ils semblent plus lourds que Lua. J'aimerais entendre parler d'autres expériences là-bas cependant.

Autres conseils

Je peux fortement vous recommander de consulter Luabind . Il est très simple d'intégrer Lua dans votre code C ++ et vice versa. Il est également possible d'exposer des classes C ++ entières à utiliser dans Lua.

La meilleure solution consiste à intégrer Lua (www.lua.org) ou Python (www.python.org). Les deux sont utilisés dans l’industrie du jeu et tous deux ont accès à extern "C". fonctionne relativement facilement avec lua ayant un bord ici (car les types de données sont plus faciles à traduire entre lua et C). L'interfaçage avec des objets C ++ demandera un peu plus de travail, mais vous pouvez rechercher comment le faire sur Google, sur des forums de discussion Lua ou Python.

J'espère que cela aide!

Vous pouvez vraiment faire ce que vous voulez avec Python. Voici la documentation relative à l'intégration de Python dans une application. Je suis certain que Lua le ferait. travaille aussi, je suis juste moins au courant.

Vous décrivez le mode multitâche coopératif, dans lequel le script doit appeler une fonction Break ou Wait périodiquement. Une meilleure solution consisterait peut-être à exécuter le langage de script dans son propre thread, puis à utiliser des mutex ou des files d'attente sans verrouillage pour les interfaces entre le langage de script et le reste de votre programme. De cette façon, un script buggy qui n’appelle pas assez souvent Break () ne peut pas geler accidentellement votre programme.

Consultez le Boost.Python bibliothèque. Il semble qu'il devrait être assez simple de faire ce que vous voulez.

Consultez SWIG . Je l'ai utilisé pour l'interface avec Python, mais il prend en charge de nombreux autres langages.

Encore un vote pour Lua. C'est petit, c'est rapide, cela ne consomme pas beaucoup de mémoire (pour les jeux, le mieux est d'allouer un grand tampon lors de l'initialisation et de rediriger toutes les allocations de mémoire Lua là-bas). Nous avons utilisé tolua pour générer des liaisons, mais il existe d’autres options, dont la plupart sont beaucoup plus simples et faciles à utiliser (IMO) que boost.python.

En ce qui concerne le débogage de Lua (si vous choisissez cette voie), j'utilise DeCoda et ce n’est pas mauvais. Il prétend être un IDE, mais en quelque sorte échoue, mais vous pouvez attacher le processus de débogage à Visual Studio et descendre la pile d'appels aux points de rupture. Très pratique pour traquer ce bogue.

Vous pouvez également intégrer des scripts C / C ++ à l’aide de Ch . Je l'utilise pour un projet de jeu sur lequel je travaille, et tout se passe bien. Beau mélange de puissance et d'adaptabilité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top