我正在开发一个从 Quake 2 松散地继承下来的游戏引擎,添加了一些诸如脚本效果之类的东西(允许服务器向客户端详细指定特殊效果,而不是只有客户端能够使用的有限数量的硬编码效果的。)这是网络效率与灵活性的权衡。
我遇到了一个有趣的障碍。看,最大数据包大小是 2800 字节,每个客户端每帧只能发出一个。
这是做“火花”效果的脚本(可能对子弹撞击火花、电击等有好处) http://pastebin.com/m7acdf519(如果您不理解,请不要出汗;这是我制作的自定义语法,与我提出的问题无关。)
我已尽一切可能缩小该脚本的大小。我什至将变量名简化为单个字母。但结果正好是 405 个字节。这意味着每帧最多可以容纳 6 个。我还想到了一些服务器端更改,可能会再减少 12 个,而协议更改可能会再节省 6 个。虽然节省会因您使用的脚本而异。
然而,在这 387 个字节中,我估计只有 41 个字节在效果的多次使用中是唯一的。换句话说,这是压缩的主要候选对象。
恰好 R1Q2(具有扩展网络协议的向后兼容 Quake 2 引擎)具有 Zlib 压缩代码。我可以解除此代码,或者至少密切关注它作为参考。
但是 Zlib 一定是这里的最佳选择吗?我能想到至少一种替代方案,LZMA,而且很容易有更多。
要求:
- 必须非常快(如果每秒运行超过 100 次,性能损失必须非常小。)
- 必须将尽可能多的数据塞进 2800 字节
- 元数据占用空间小
- GPL 兼容
Zlib 看起来不错,但还有什么更好的吗?请记住,这些代码还没有被合并,所以有足够的实验空间。
谢谢,-马克斯
编辑:感谢那些建议将脚本编译成字节码的人。我应该说清楚——是的,我正在这样做。如果你喜欢你可以在我的网站上浏览相关的源代码,虽然它仍然没有“修饰”。
这是服务器端代码:
Lua 组件:http
://meliaserlow.dyndns.tv:8000/alienarena/lua_source/lua/scriptedfx.lua
C 组件: http://meliaserlow.dyndns.tv:8000/alienarena/ lua_source /game/g_scriptedfx.c
对于我发布的特定示例脚本,这将 1172 字节的源代码缩小到 405 字节——仍然不够小。(请记住,我想将尽可能多的这些内容放入 2800 字节中!)
EDIT2:不能保证任何给定的数据包都会到达。每个数据包都应该包含“世界状态”,而不依赖于先前数据包中传达的信息。通常,这些脚本将用于传达“眼睛糖果”。如果没有空间,它就会从数据包中丢弃,这没什么大不了的。但是,如果掉了太多,事情开始在视觉上看起来很奇怪,这是不可取的。