2011-11-03 93 views
3

快速设计问题:为了在彼此之间发送事件,我需要在我的游戏引擎架构中的客户端 - 服务器网络之间实现一种通信形式。Java - 网络上的对象流效率

我选择创建事件对象,因此我想知道将这些对象序列化并通过简单套接字网络上的对象流传递它们的效率如何?

也就是说,它相对于创建对象的字符串表示,通过char流发送字符串和解析字符串客户端有多高效?

事件将发送到每个游戏循环,如果不是更多;但事件对象本身只是一些简单的包装器,用于一些java基元。

感谢您的洞察!

(TL;博士 - 是通过网络对象流高效?)

+1

我建议启动一个Wireshark(http://www.wireshark.org/)并测试自己。 – Brad

回答

3

如果性能是首要的问题,我建议使用Protocol Buffers了自己的自定义序列化和Java的本机序列两者。

乔恩斯基特给出了很好的解释,以及基准这里:High performance serialization: Java vs Google Protocol Buffers vs ...?

如果您不能使用的PB,我怀疑Java的本机序列将不是从String手动序列化/反序列化更加优化。这种差异是否显着可能取决于你序列化对象的复杂程度。与往常一样,您应该通过基准来确认您的预测。

事实上,你通过网络发送东西应该没有关系。

1

编辑:对于时间要求严格的应用程序Protocol Buffers是更好的选择。但是,在我看来,开发时间显着增加。实际上,你必须对每个交换消息进行两次编码:一次是作为一个.proto文件编译并吐出java包装器,一次作为一个POJO,使这些包装器有用。但这是从文档猜测。编辑

摘要
结束:去的对象流

那么,什么是少?编写对象,发送字节流并解码它所需的时间 - 全部由手工完成 - 或编码对象所需的时间,发送字节流以及解码它 - 所有这一切都需要通过可靠的尝试序列化机制来完成?

你应该确保你发送的对象尽可能小。这可以通过枚举值,查找表等来实现。每次传输可能会删除几个字节。序列化算法对我来说显得非常快速,而且你编码的任何东西都会完全相同。当你重新发明轮子时,往往会出现三角形。

+0

只要性能(或小序列化大小)很重要,那么使用本机Java实现始终是错误的决定。无论如何,Protobuf并不复杂得多,提供跨语言支持,只是方式,方式更快。甚至有趣的是,如果序列化瓦特/ Java实习生需要40毫秒,而protobuf它在<2 .. – Voo

+0

@Voo是40ms是一个真正的测量数字? – EJP

+0

已经查看了ProtoBuf文档。太糟糕了,9个月前,当我建立通信基础设施时,这将会非常有用。因为,本地序列化就像一个魅力,并且对于我的目的来说足够快(往返时间大约为50-100ms,用于序列化,发送到局域网中的服务器,反序列化,服务器端处理,重新序列化并发回给所有客户)。也许为广域网旅程添加几十毫秒,并且对于大多数应用程序来说足够快。 –