Je veux intégrer Javascript dans un de mes moteurs de jeux. Maintenant que nous avons la 5ème génération de moteurs Javascript (tous très rapides), je suis curieux de savoir quel moteur choisiriez-vous d'incorporer dans un framework C++ (qui inclut la facilité réelle de l'incorporer)?
Remarque: Juste pour être clair, je ne suis pas intéressé par les scripts DOM ou l'écriture de Javascript dans un navigateur.
Voici une compilation de liens jusqu'à présent et quelques conseils du fil
Juste pour mémoire, j'aime Lua et je l'ai déjà intégré dans les moteurs de jeu environ 5 fois au travail.
Cependant, maintenant c'est un projet de loisir, et je pense que Javascript est connu de la plupart des développeurs Web et parce que ses développeurs ECMA, Flash et Flex, un moteur de jeu qui utilise Javascript et XML pour les scripts serait plus convivial et s'adresserait à un plus grand base d'utilisateurs (et une qui jusqu'à présent n'a pas eu la chance d'utiliser leurs compétences pour les jeux) qu'une avec Lua (et il y en a beaucoup autour!).
Pour mémoire, j'irai avec V8 sur celui-ci, principalement parce que j'aime son style C++.
SpiderMonkey de Mozilla est assez facile et bien documenté. C'est une API C, mais il est simple de l'envelopper en C++. Il peut être compilé pour être thread-safe, ce qui est utile pour les jeux car vous voudrez probablement avoir votre logique principale dans un thread et la logique de l'interface utilisateur dans un deuxième thread.
V8 de Google pourrait être un bon choix, car vous utilisez C++, mais je n'ai pas encore d'expérience avec lui. Selon la documentation (grâce à Daniel James ), V8 n'est pas thread-safe, bien que cela puisse changer à l'avenir.
Il y a aussi SquirrelFish de WebKit , mais je n'ai pas pu trouver une version autonome de cela quand je regardais plus tôt.
J'ai essayé à la fois SpiderMonkey et V8. Avec SpiderMonkey, je n'ai rien pu faire travailler. Je n'ai même pas pu obtenir les exemples sur mozilla.org à compiler.
V8 a fonctionné prêt à l'emploi et j'ai eu une interaction C++ <-> Javascript de base qui va assez rapidement. Il existe des listes Google pour les utilisateurs de V8, et j'ai déjà trouvé la plupart de mes questions.
Je pense que la v8 ne fonctionne pour le moment que sur les processeurs x86, x64 et arm. Ce qui pourrait être un inconvénient.
En ce qui concerne la sécurité des threads, de include/v8.h :
* Multiple threads in V8 are allowed, but only one thread at a time
* is allowed to use V8. The definition of 'using V8' includes
* accessing handles or holding onto object pointers obtained from V8
* handles. It is up to the user of V8 to ensure (perhaps with
* locking) that this constraint is not violated.
Vous pouvez en lire plus dans le fichier source (il ressemble à la documentation doxygen, mais ils ne semblent l'avoir mis nulle part).
Mise à jour: Ce commentaire a été supprimé, il y a probablement un certain temps. Il semble que v8 possède désormais un objet Isolate
qui représente une instance du moteur. Une seule instance Isolate
ne peut être utilisée que dans un seul thread à la fois, mais d'autres instances Isolate
peuvent être utilisées dans d'autres threads en même temps.
Java Script est-il vraiment le bon langage pour votre jeu? Beaucoup de jeux utilisent le langage de programmation Lua pour les scripts. Il est facile à intégrer, il est très petit, il se compile sur presque toutes les plateformes et il est facile à apprendre.
C'est un peu hors sujet, mais sortir des sentiers battus peut être important pour bien faire les choses.
Le référence qui est apparu lorsque le V8 a fait son apparition pour la première fois, montrant que le V8 était 1000% (ou autre) plus rapide que les autres moteurs, était fortement axé sur les moteurs qui étaient bons en récursivité. Si votre code utilise beaucoup de récursivité, alors V8 pourrait vous donner un avantage significatif, en termes de vitesse. Pour le "monde réel" (actuellement, au moins) les trucs Web, SquirrelFish Extreme semble être le gagnant haut la main en ce moment (voir mon blog sur le sujet pour les résultats de mes propres tests informels ).
Comme d'autres l'ont souligné, la facilité d'intégration et la qualité de la documentation peuvent prévaloir sur la vitesse pure. Cela ne signifie pas Jack si vous ne livrez pas!
Lorsque vous parlez d'un moteur de script et de c ++, vous pouvez également considérer chaiscript . Il est proche du script ecma (~ Javascript) et très facile à intégrer en c ++.
Vendeur de la page Web:
... ChaiScript, d'autre part, a été conçu à partir de zéro avec l'intégration avec C++ à l'esprit. ... ChaiScript n'a pas de méta-compilateur, pas de dépendances de bibliothèque, pas de configuration système requise et aucun bagage hérité d'aucune sorte. At peut fonctionner de manière transparente avec toutes les fonctions C++ que vous lui exposez. Il n'est pas nécessaire de le dire explicitement sur n'importe quel type, il est centré sur la fonction.
Avec ChaiScript, vous pouvez littéralement commencer à écrire votre application en ajoutant trois lignes de code à votre programme et en ne modifiant pas du tout vos étapes de construction.
J'attendrais que TraceMonkey, la prochaine évolution de SpiderMonkey, sorte. Plus rapide et mieux conçu. (Utilise le code donné par Adobe Flash).
Tracemonkey est fier de rendre les actions répétitives beaucoup plus rapides en optimisant agressivement la structure lors de l'exécution en fonction de l'utilisation réelle, ce qui pourrait être pratique pour augmenter le jeu.
Essayez Javascript .NET:
http://javascriptdotnet.codeplex.com/
Il implémente Google V8. Vous pouvez compiler et exécuter Javascript directement à partir du code .NET avec lui, et fournir également des objets CLI à utiliser par le code Javascript. Et V8 est probablement le meilleur moteur jamais créé en termes de performances, il génère du code natif à partir de Javascript.
Je garderais un œil sur la v8 car elle crie à un moteur javascript rapide, et je suis sûr qu'elle développera une prise en charge multiplateforme à mesure qu'elle grandira.
Vous pouvez également consulter V8 de Google. C'est assez nouveau, cependant.