使用Lua脚本为MMO服务器定义游戏逻辑会比用C ++编译慢很多吗?


10

我正在为MMO服务器使用实体系统,并且正在考虑使用Lua脚本定义“动作”的行为。服务器是用C ++编写的。我对C ++中Lua的速度/内存使用不是很熟悉,但是我已使用它来编写客户端GUI的脚本。使用Lua在服务器端定义游戏逻辑会大大降低性能吗?


Answers:


20

TL; DR:Lua确实有开销,但是如果使用得当,它可以忽略不计并且可以轻松缓解。不要将其用于繁重的数学运算或变换几何。使用它编写GUI脚本,您可能根本看不到任何性能问题。

我已经完成了一些关于Lua作为游戏脚本语言的性能的基本基准测试,而且非常快。使用tolua ++将LuaJIT绑定到我的游戏引擎上,我产生了2,000个actor,每个actor由一个称为每个游戏循环(带有time-delta参数)的Lua脚本控制。一半的演员有植绒脚本,另一半则进行某种随机游走(羊群避免了)。

关闭渲染组件后,我的Opteron 170(2x2.0GHz,虽然我的引擎当时是单线程的)每秒给我提供了400滴答声。我想如果我深入研究并进行优化,我可能会比现在挤出更多的东西,也许将一些繁重的工作移回C ++中。每秒更新2000名演员400次仍然令人印象深刻,并且远远超出了我当时的期望。

现在,我在所有项目中都使用Lua,它实际上构成了实际游戏代码(AI,GUI布局/逻辑,事件/消息)的很大一部分。当您可以快速更改某些内容并对其进行测试而不必退出,重新编译和重新初始化时,制作游戏会更加有趣。我不时遇到一些性能问题,但是可以通过在C ++中重新实现有问题的代码(然后从Lua调用它)来轻松解决这些问题。

EVE Online的服务器虽然有点偏离主题,但几乎完全是用Stackless Python编写的(我相信它们会将大多数数学运算推迟到C ++库中),这比Lua重得多,并且基于我个人的研究和一些可用的研究基准,远不及LuaJIT。他们设法处理30k +并发玩家,没有太多问题。当然,他们确实有大量昂贵的硬件运行所有这些,但是我相信大部分成本都在他们的数据库集群中。

致歉的文字墙。


1
好答案!如此详细的答案无需道歉。我想我将花一些时间来开发Lua中定义的组件“操作”并进行一些基准测试。谢谢!
BarakatX2'9

2
在这类系统中,最大的损失通常是解析脚本,因此请确保在启动时将其提前加载。
coderanger

这是个好的观点。实际上,我在打包发布之前将Lua编译成字节码,这可能会减少加载时间,尽管我没有做任何测量。
Codewaffle

我倾向于不同意。在普通游戏中,游戏逻辑仅占执行时间的一小部分(渲染是野兽),而在MMO服务器中,则是更大的一部分,因此影响会更大。我有使用LUAJit和C ++的经验,虽然LUAJit实质上比LUA快,但它仍然比C ++慢很多(假设您正确地编写C ++)。我承认LUAJit的工作流程很棒,但是速度确实很成功。无论如何扭曲,带有字符串查找,动态类型和垃圾回收的表中的变量都是有代价的。LUAJit比.NET慢,这份厚礼说
凯伊

2

简短的回答:是的,是的。

长答案:这取决于多少游戏逻辑,多少游戏逻辑,多么复杂,以及是否需要为每个玩家运行。如果它非常简单并且不重复很多,那么您可能会满意的。但是对于大多数情况,使用LUA而不是C ++会给您带来更低的性能,并且伸缩性很差,当然,前提是假定代码是经过精心设计和优化的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.