游戏的网络消息序列化

时间:2010-12-26 23:39:09

标签: c# networking serialization compression

退出游戏制作一个名为photon的网络图书馆产品,他们拥有并积极开发有限的mmo演示。而不是拍摄json或XML等,说“MovePlayer”(带有相关的参数),他们通过枚举将这个消息固定为2位数字 - 类似于Operations.MovePlayer。无可否认,2位数字的int小于较长的字符串,但我真的很讨厌将每条消息静态刻录到枚举中。

是否有另一种方法让MessageID属性根据查找表或其他东西为自己分配一个唯一的2位int?有没有人以前处理过这种事情?

2 个答案:

答案 0 :(得分:3)

对于游戏来说,这不是“老派”的做事方式 - 这是常态。

这是因为,与服务器将在短时间内发送客户端数据的典型Web服务不同,在游戏中,服务器和客户端不断地来回发送 的数据包。每个客户端的状态与每个客户端的状态以玩家数量呈指数级同步所需的数据包数量,因此您的游戏拥有的玩家越多,保持数据包大小越小就越重要。

同样,越过MTU size(通常大约1400字节)将导致数据包碎片,这会对性能产生重大影响。

另请注意,对于为XBox 360制作的游戏,Microsoft对每秒8千字节的上载和下载限制,因此您几乎无法使用XML创建用于网络消息的MMO。


至于如何将字节转换为消息类型:只需使用switch语句,或存储Dictionary<byte, Type>Dictionary<byte, Func<Message>> (假设您有一堆消息所有派生自基类Message

的类

答案 1 :(得分:1)

这是一种非常古老的做事方式,让我想起了80年代。

我的公司正在使用Agatha(请求经纪人)在我们的MMO中发送消息:

http://davybrion.com/blog/2009/11/hello-world-with-agatha/