使用序列化通过套接字而不是字符串发送对象
Using serialization to send objects over sockets instead of strings
我正在用 C# 制作一款游戏,它使用套接字在玩家之间传输数据,包括三个用于位置的浮点数和一个用于旋转的浮点数。目前我正在使用编码为二进制的字符串来执行此操作,我知道这是非常低效的,并且可能会导致服务器上有 5 个玩家每秒更新 32 次时出现问题,尤其是由于必须从浮点数转换为字符串并返回并拆分字符串。我认为序列化可能很好,因为(我假设)它的 space 效率和速度。不过,我仍然不确定一些事情:
- space 效率更高吗?
- 序列化比转换为字符串更快吗?
- 如何分离对象? (我使用“
”来了解每次更新以字符串结束的位置)
- 序列化是个好主意吗?
- 还有其他推荐的替代品吗
我不会使用二进制序列化程序,因为正如概述的那样here它是一个巨大的安全漏洞
这是一个很大的话题。您可以使用众所周知的序列化库、通信框架或构建您自己的。看看 Message pack, Protocol buffers gRPC and so on for libraries and frameworks. If you want to build it all yourself I'd recommend using fixed frames. Have a look at Stephen Cleary's blog entry about Message Framing as well as the new IO Pipelines 也特别是如果你想自己构建一个终止符分隔的协议。
我正在用 C# 制作一款游戏,它使用套接字在玩家之间传输数据,包括三个用于位置的浮点数和一个用于旋转的浮点数。目前我正在使用编码为二进制的字符串来执行此操作,我知道这是非常低效的,并且可能会导致服务器上有 5 个玩家每秒更新 32 次时出现问题,尤其是由于必须从浮点数转换为字符串并返回并拆分字符串。我认为序列化可能很好,因为(我假设)它的 space 效率和速度。不过,我仍然不确定一些事情:
- space 效率更高吗?
- 序列化比转换为字符串更快吗?
- 如何分离对象? (我使用“
”来了解每次更新以字符串结束的位置) - 序列化是个好主意吗?
- 还有其他推荐的替代品吗
我不会使用二进制序列化程序,因为正如概述的那样here它是一个巨大的安全漏洞
这是一个很大的话题。您可以使用众所周知的序列化库、通信框架或构建您自己的。看看 Message pack, Protocol buffers gRPC and so on for libraries and frameworks. If you want to build it all yourself I'd recommend using fixed frames. Have a look at Stephen Cleary's blog entry about Message Framing as well as the new IO Pipelines 也特别是如果你想自己构建一个终止符分隔的协议。