gpt4 book ai didi

c# - 服务器-客户端消息的快速文本解析器 - MMO

转载 作者:行者123 更新时间:2023-11-30 21:09:45 26 4
gpt4 key购买 nike

申请

我正在开发一款 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或实时在线游戏中,客户端和服务器之间的消息打包和读取的标准方法是什么?

最佳答案

二进制协议(protocol)在这里会快很多。以您传入的坐标为例。当您将它们作为字节传输时,它们每个轴将占用 8 个字节,而字符串表示使用 2 个字节每个字符(除非您作为 ASCII 传输,但即使这样二进制 double 也会更小)。

然后实际将该字符串转换为数字需要做更多的工作;首先必须创建一个子字符串,之后会产生垃圾收集开销,必须解析数字,这速度不快(但公平地说,您仍然可以每秒解析数十万个 double ),因为 .NET 的 double.Parse 非常通用,必须适应许多不同的格式。如果您坚持使用文本,您可以通过编写自己的双重解析器获得显着的速度,但就像我说的,如果消息解析是瓶颈,您应该使用二进制。将字节转换为 double (使用一点点 unsafe 魔法,如果您正在运行服务器并且应该具有完全信任模式,这应该没问题)是复制 8 个字节的问题。

如果您的消息主要只是坐标等,我认为您可以通过创建自己的二进制格式获益良多。

关于c# - 服务器-客户端消息的快速文本解析器 - MMO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com