游戏服务器脚本的设计与选择

游戏服务器脚本的设计与选择

  简介:最早脚本在游戏行业流行开来是在游戏的客户端,由于他有编写效率快,运行稳定不易崩溃,学习成本低的特点,在服务器方面也应用的越来越多,在这个敏捷的时代,开发效率比运行效率似乎更受青睐。所以,游戏服务器中几乎没有不用脚本的。

为什么要用脚本

  RPG类游戏服务器由于对响应和吞吐量都有很大要求,一些核心功能和接口设计开发的时候仍然是已c++、java、c#这种高性能编译型开发语言为主,在现今多核时代,硬件性能虽然越来越强劲,但是游戏服务器多进程单线程的设计特点,导致现在的局面是核心代码仍然是c++为主。像移动、战斗这种还是用c++语言开发性能最优保障。但是c++不是个敏捷的语言啊,学习成本又搞,招人又难,开发效率又慢,crash一下找半天,还有半天是在编译,这个时候正好脚本语言可以弥补其缺点。使用脚本的注意事项:

  • 脚本语言性能跟c++不可同日耳语,使用脚本的时候,一般选性能不敏感的功能模块。
  • 脚本语言一遍都有内存使用的最大限制,在用脚本缓存数据的时候,切记不要缓存太多的动态数据,一般只要缓存一些配置比较适合
  • 脚本语言有热更新的优点,这个一定要善于利用,当线上出了bug,热更新一下脚本修复下,非常的有价值。
  • 为了更好的能够使用热更新,脚本最好是无状态的,即脚本内没有缓冲游戏逻辑数据,重载的只是运行期的逻辑代码,这就要求游戏数据缓存在c++层,然后注册一些操作数据的接口给脚本,这样脚本无论怎么重载,都不影响数据,好处是脚本实现了无状态,当然坏处是所有数据都要通过c++接口获取后再处理,然后在调用接口修改,无形中损失了性能,另外导出的c++接口太多后,接口文档的维护也是不容易的工作,但是相比于无状态带来的好处,还是值了。
  • 脚本最起码不会出现段错误这种让人毛骨悚然的bug,当然调用c++接口的时候如果c++接口本身有bug这个当然算另外一码事。本身脚本的稳定也是一大优点,前边说了无状态的脚本,又不用担心内存泄漏的问题,如果是有状态的,脚本的多重引用很少有人能hold住,内存泄漏比c++还难查,所以脚本中无状态设计绝对是明智的选择啊。

  既然要用脚本,市面上用的比较多的脚本有lua、python、js。这三个算目前最为流行的脚本,这里分别讨论下。

使用lua的注意事项

  lua目前而言算是使用最多的脚本语言。

  • lua 与其他脚本相比,性能最好
  • 学习成本低,语法简单,主要数据结构就是table,不过lua的table也算双刃剑,因为不区分列表和字典,用的时候总是怪怪的。
  • lua没有class关键词,面向对象也是基于table模拟出来的。
  • lua设计之初就是作为胶水语言,语法有局限,没有很复杂的语法糖,这样设计比较复杂的数据结构和功能时候比较吃力
  • lua嵌入api还算简单,主要需要弄懂lua的
1
numEntity = h2ext.callFunc('Entity.totalNum')

  python中调用

1
2
import h2ext
numEntity = h2ext.callFunc('Entity.totalNum')