c#客户端用protobuf序列化的时间很长解决方法

c#客户端用protobuf序列化的时间很长
本帖最后由 zcz3313 于 2014-09-23 00:51:22 编辑
第一次来论坛发帖,想问问各位有过使用protobuf经验的大大给点意见,不甚感激!
unity项目,客户端开10个连接,用自带的profile分析器分析后发现两个问题:
1.同一个消息类型,第一次序列化的时间是后面的两倍之多,即,第一次发送可能需要10ms,第二次只要5ms,第三、第四。。。都是5ms左右。
2.性能不达标,我在实际测试中,10个连接,就算不考虑第一次的序列化时间,后面的每一次发送前的序列化基本都要占用0.28ms/次,这个时间已经非常多了,还要考虑到异步发送等等,基本上最后发一个消息就要占用0.5ms/次-0.7ms/次,我看网上大家测的性能和我相差甚远,故怀疑是我哪里没做好。

我的做法是这样的,.proto文件中定义消息类型,我的测试消息是三个string,一个int,一个float,总共5个字段的message。然后用protoc生成代码,然后用precompile进行预编译(这里说一句,如果不预编译,直接放到项目中,第一次序列化时间更长!),最后得到的dll和protobuf-net一起放到项目中。

调用的时候也是网上能搜到的方式
MyProtobufSerializer pbs = new MyProtobufSerializer();
MemoryStream ms = new MemoryStream();
pbs.Serialize(ms, cmd);//cmd是消息

如上,profile分析器中看到的性能显示每次开销都会在protobuf里面的一个叫做SerializeCore的函数上,基本上时间都花在这上面了。。。。头疼着,找了很多资料,希望各位大侠给点方向。。。
------解决思路----------------------
其实你是在一个线程里创建了10个连接,然后把连接对象放到了数组中而已
既然都是在同一个线程里(而且很有可能你是直接在主线程中创建的)
那么每个连接的通信等待过程,都会阻塞其他连接的正常执行
------解决思路----------------------
试试fastCSharp的代码生成方式,不过没有在mono/unity的真实环境下测试过。
------解决思路----------------------
另外客户端确实不需要太多连接,一个足矣,而且效率最好。