c# - 游戏的网络消息序列化

标签 c# networking serialization compression

Exit-games 制作了一个名为 photon 的网络图书馆产品,他们已经并积极开发了一个有限的 mmo 演示。他们不是通过 json 或 XML 等发出“MovePlayer”(带有关联的参数),而是通过枚举将该消息缩减为 2 位整数——类似于 Operations.MovePlayer。不可否认 2 位数的 int 比更长的字符串要小,但是我真的很讨厌将每条消息静态地烧录到枚举中的想法。

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

最佳答案

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

这是因为,与典型的 Web 服务不同,在典型的 Web 服务中,服务器会在短时间内、罕见地突发性地发送客户端数据,而在游戏中,服务器和客户端不断来回发送数据包。将每个客户端的状态与每个其他的气球同步所需的数据包数量与玩家数量成指数关系,因此您的游戏拥有的玩家越多,保持较小的数据包大小就越重要。

另外,遍历 MTU size (通常约为 1400 字节)会导致数据包分段,这会对性能产生显着影响。

另请注意,Microsoft 对为 XBox 360 制作的游戏设置了每秒 8 KB 的上传和下载限制,因此您几乎不能使用用于网络消息的 XML 创建 MMO。


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

关于c# - 游戏的网络消息序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4535879/

相关文章:

c# - 使用 HttpWebRequest 流式传输大文件时出现内存不足异常

java - 如何知道我们是否收到了带有 DatagramPacket 的内容?

c# - 将自定义类的集合添加到 Settings.Settings

c# - 使用 XML Serializer 序列化枚举——我保留了名称,但丢失了值。有什么办法可以同时保留两者?

c# - 重新启动 USB 设备?

非矩阵数据类型的 C# 和 MATLAB 互操作性

android - "broken pipe"异常对 Socket 到底意味着什么?

json - SignalR 2.0.0 beta2 IJsonSerializer 可扩展性

c# - 动态 LINQ 加入 DataTable 上的动态列

cocoa - 从 Cocoa 应用程序在远程计算机内移动文件的最快方法?