我目前正在构建游戏服务器(不是引擎),我希望它可以扩展,就像插件系统一样。
我找到的解决方案是使用脚本语言。到现在为止还挺好。
我不确定我是否应该使用Ruby或Lua。 Lua更容易嵌入,但Ruby有一个更大的库,更好的语法(在我看来)。问题是,我发现使用Ruby作为C ++脚本语言没有简单的方法,而Lua则非常容易。
坚持这个?使用Ruby作为脚本语言的建议(我尝试过SWIG,但它不像使用Lua那样整洁)?
感谢。
答案 0 :(得分:12)
我之前看过将Ruby嵌入到C / C ++中,看起来非常困难。你将面临很多挑战:
我确信这个可以完成,但对我来说这似乎非常困难,只有你能在最少的入口点跳进Ruby才能实现。
答案 1 :(得分:8)
我过去曾广泛使用过Lua。
Luabind非常容易使用,不需要像SWIG这样的外部生成器,文档很棒。编译时间仍然不错。
我见过的最大问题:lua主要是......只写。你没有真正的类,但只有带有一点语法糖的关联数组(object ['key']可以写成object.key),所以你很容易在一个模糊的函数中添加一个'成员',完全忘记了关于它,并在以后有副作用。
由于这个原因,仅此原因,我更喜欢Python。 Boost :: Python是Luabind的基础,因此两者都有类似的API(Luabind以前稍微容易构建但不再容易)。在功能方面,它们非常相同。
不直接相关:这些都不能在多线程环境中可靠地使用(因此这取决于服务器的复杂性)。
请注意,您仍然可以为每个线程创建一个环境,但它们将无法通信(除了使用C ++机器)。这在Lua中尤其容易。
答案 2 :(得分:6)
您可能有兴趣了解Squirrel。我相信它是Left 4 Dead 2使用的脚本语言。它比lua更高级(使用对象和类),并且可以轻松嵌入到C ++应用程序中,这听起来就像你正在寻找的那样。
答案 3 :(得分:2)
去寻找lua,虽然我推荐luajit,不仅仅是为了速度,而是为了新的ffi库,增强了对最大的互通:)。 Lua也有模块的音调,新的模块很容易创建,这弥补了stdlib的不足。
答案 4 :(得分:1)
Lua要做的一件事就是它能够非常轻松地在C ++(或C)与其自身之间传递数据。基本上,您只是将数据推送/弹出到堆栈中,以便在两者之间进行通信。同时启动和运行多个Lua环境也非常简单(如果您需要该功能)。尽管Lua是一种垃圾收集语言,但很容易阻止它在需要在C ++代码中保留的数据上这样做。一旦你奠定了基础,Lua就可以轻松创建一个可扩展的插件系统。在运行时交换插件(在这种情况下,脚本)也非常简单(尽管对Ruby来说也是如此,我对它的了解还不够熟悉)。
要考虑的一件事是您希望脚本能够处理多少面向对象的内容。 Lua使用函数,表,元表和原型来实现类似OO的编程。有些人喜欢它,有些人不喜欢;我个人觉得有趣的是,如果有时候有点笨拙的话。没有使用Ruby,我不能代表它,但你可能想要权衡对象/类支持的需求。
我认为在您的情况下,您还应该考虑您希望项目启动和运行的速度。正如你和其他人所指出的那样,Ruby很难嵌入到C ++中,而Lua则不然。时间永远是宝贵的,如果你想尽快得到一些工作,Lua可能是你最好的选择。
答案 5 :(得分:0)
我会选择最容易学习的东西/让大多数玩家使用它。您希望它尽可能地为您的客户所用。