【发布时间】:2012-01-14 23:46:23
【问题描述】:
应用程序
我正在开发一款 MMO,但遇到了问题。我构建的 MMO 服务器速度很快,并且在 UDP 套接字上每隔约 50 毫秒在本地向我的游戏客户端发送消息。这是通过我当前的消息系统从服务器到客户端的消息示例:
count={2}body={[t={agt}id={42231}pos={[50.40142117456183,146.3123192153775]}rot={200.0},t={agt}id={4946}pos={ [65.83051652925558,495.25839757504866]}rot={187.0}}
count={2}, 2 = number of objects
[,] = array of objects
我搭建了一个简单的文本解析器,代码:http://tinypaste.com/af3fb928
我使用这样的消息:
int objects = int.Parse(UTL.Parser.DecodeMessage("count", message));
string body = UTL.Parser.DecodeMessage("body", message);
for (int i = 0; i < objects; i++)
{
string objectStr = UTL.Parser.DecodeMessage("[" + i + "]", body);
// parse objecStr with UTL.Parser.DecodeMessage to extract pos & rot and apply to objects
)
问题
当我有更多对象 ~ 60+ 时,性能会急剧下降。
问题
在 MMO 或实时在线游戏中,客户端和服务器之间打包和读取消息的标准方法是什么?
【问题讨论】:
-
很高兴你接受了我的回答,但我仍然想听听你最后做了什么以及是否有帮助。
-
@Groo 我想我会根据你提出的建议优化我的解析器;如果有的话,这是一个很好的做法。在我崩溃和燃烧的机会中,我可能会尝试 JSON。我真的不想仅仅因为我对它不满意而进行序列化,而且这似乎有点矫枉过正。
-
我实际上将 此优化 称为矫枉过正,而只是抓住protobuf-net 并调用它的
Serialize/Deserialize方法。但我同意这是一个很好的做法,我可能也会这样做,只是为了看看我能剃掉多少个时钟。尽管如此,由于 protobuf 是二进制的,它会更好地打包数据并可能增加吞吐量,因此即使您对代码感到满意,也值得检查一次。 @tzaman 还提供了一些非常有趣的替代方案,其中一些我以前从未听说过。
标签: c# performance message text-parsing mmo