快速设计问题:我需要在我的游戏引擎架构中的客户端 - 服务器网络之间实现一种通信形式,以便在彼此之间发送事件。
我选择创建事件对象,因此,我想知道序列化这些对象并通过简单套接字网络传递对象流的效率如何?
也就是说,相对于创建对象的字符串表示形式,通过char流发送字符串以及解析字符串客户端方面效率有多高?
事件将在每个游戏循环中发送,如果不是更多;但是事件对象本身只是一些java原语的简单包装。
感谢您的见解!
(tl; dr - 网络上的对象流是否有效?)
答案 0 :(得分:3)
如果性能是主要问题,我建议在您自己的自定义序列化和Java的本机序列化上使用Protocol Buffers。
Jon Skeet在这里提供了一个很好的解释和基准:High performance serialization: Java vs Google Protocol Buffers vs ...?
如果您不能使用PB,我怀疑Java的本机序列化将比从String
手动序列化/反序列化更加优化。这种差异是否显着可能取决于您要序列化的对象的复杂程度。与往常一样,您应该进行基准测试以确认您的预测。
您通过网络发送内容无关紧要。
答案 1 :(得分:1)
编辑:对于时间要求严格的应用,协议缓冲区似乎是更好的选择。但是,在我看来,开发时间显着增加。实际上,您必须对每个交换消息进行两次编码:一次作为.proto文件编译并吐出java包装器,一次作为POJO,使这些包装器中的一些有用。但这是从文档中猜测的。
编辑结束
摘要: 转到对象流
那么,更少呢?编写对象,发送字节流和解码所需的时间 - 所有这一切 - 或者编写对象,发送字节流和解码所需的时间 - 所有这一切都是通过可靠且经过尝试的序列化机制完成的?
您应确保发送的对象尽可能小。这可以通过枚举值,查找表等在可能的情况下实现。每次传输可能会刮掉几个字节。对我来说,序列化算法看起来非常快,你编写的任何代码都会完全相同。当你重新发明轮子时,你经常会得到三角形。