我想在我的业余爱好游戏引擎中嵌入Javascript.现在我们已经推出了第5代Javascript引擎(速度极快)我很好奇你会选择在C++框架中嵌入什么引擎(包括嵌入它的实际容易程度)?
注意:为了说清楚,我对DOM脚本或在浏览器中编写Javascript不感兴趣.
这是迄今为止的链接汇编和线程的一些提示
蜘蛛猴
tracemonkey(注意:向后兼容spidermonkey):
V8
金鳞
仅仅为了记录,我喜欢Lua并且已经在游戏引擎中嵌入了大约5次工作.
然而,现在这是一个业余爱好项目,我认为Javascript被大多数Web开发人员所熟知,并且因为它的ECMA,Flash和Flex开发人员,使用Javascript和XML进行脚本编写的游戏引擎将更加用户友好并迎合更大的需求用户群(以及迄今为止没有机会使用他们的技能进行游戏的用户群)比使用Lua的用户群(并且周围有很多人!).
另外为了记录,我会在这个上使用V8,主要是因为我喜欢它的C++风格.
Mozilla的SpiderMonkey非常简单且记录完备.它是一个C API,但它很容易用C++包装.它可以被编译为线程安全的,这对游戏很有用,因为你可能想要在一个线程中使用主逻辑,在第二个线程中使用用户界面逻辑.
谷歌的V8可能是一个不错的选择,因为你使用的是C++,但我还没有使用它的经验.根据文档(感谢Daniel James),V8不是线程安全的,虽然这可能会在未来发生变化.
还有WebKit的SquirrelFish,但在我之前看时,我找不到它的独立版本.
我已经尝试过SpiderMonkey和V8.使用SpiderMonkey,我无法获得任何工作.我甚至无法在mozilla.org上获得编译的示例.
V8开箱即用,我得到了一些基本的C++ < - > Javascript交互很快.对于使用V8的人来说,有一些谷歌列表,我发现我的大部分问题都已在那里得到解答.
Java Script是否真的适合您的游戏?许多游戏都使用Lua编程语言编写脚本.它易于集成,非常小,几乎可以在每个平台上编译,而且易于学习.
这个有点偏离主题,但是开箱即用的想法对于把事情做好是很重要的.
我相信v8目前仅适用于x86,x64和arm处理器.这可能是一个缺点.
关于线程安全,来自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.
您可以在源文件中阅读更多内容(它看起来像doxygen文档,但它们似乎没有把它放在任何地方).
更新:该评论已被删除,可能是前一段时间.看起来v8现在有一个Isolate
代表引擎实例的对象.单个Isolate
实例一次只能在一个线程中使用,但其他Isolate
实例可以同时在其他线程中使用.
当V8第一次出现在V8上比其他引擎快1000%(或者更高)的场景时出现的基准测试结果非常偏向于支持擅长递归的引擎.如果你的代码使用了大量的递归,那么V8可能会在速度方面给你一个显着的优势.对于"现实世界"(目前,至少)网络内容,SquirrelFish Extreme目前似乎是落后的赢家(请参阅我关于我自己的非正式测试结果主题的博客文章).
正如其他人所指出的那样,易于集成和文档质量可能优于纯粹的速度.如果你不发货,这并不意味着杰克!
在谈到脚本引擎和c ++时,你也可以考虑使用chaiscript.它接近ecma脚本(~Javascript)并且很容易嵌入到c ++中.
来自网页的卖家:
...另一方面,ChaiScript是从头开始设计的,并考虑到了与C++的集成.... ChaiScript没有元编译器,没有库依赖,没有构建系统要求,也没有任何遗留的包袱.可以与您公开的任何C++函数无缝协作.它不必明确告知任何类型,它是以功能为中心的.
使用ChaiScript,您可以通过向程序添加三行代码而不是修改构建步骤来开始编写应用程序脚本.