c#客户端用protobuf序列化的时间很长

.Net技术 码拜 10年前 (2015-07-18) 1870次浏览 0个评论

第一次来论坛发帖,想问问各位有过使用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的函数上,基本上时间都花在这上面了。头疼着,找了很多资料,希望各位大侠给点方向。

#1

unity项目,客户端开10个连接
什么意思
是10个线程吗
连接又是连接到哪里

#2

回复1楼:

感谢,终于有人来啦!
是一个客户端用数组的方式创建10个连接,连到公司的服务器上(内网),然后采用协同的方式来用10个连接发消息。

#3

你应该先学习一下线程的概念,通信有关的代码,都放到线程里去
还有,能不能用一点专业术语,不要随便用协同什么的
数组只是保存变量用的,什么叫数组的方式创建啊
10分

#4

其实你是在一个线程里创建了10个连接,然后把连接对象放到了数组中而已
既然都是在同一个线程里(而且很有可能你是直接在主线程中创建的)
那么每个连接的通信等待过程,都会阻塞其他连接的正常执行

#5

回复4楼:

抱歉哈,新手描述难免不准确。
我们其实是做手游的,然后协同程序我刚查了下,好像c#是不支持的。只有unity引擎自带了。
其实我测的时候是没有把连接也算进去的。我只是观察他在序列化那个时刻的时间啊。
不知道有没有讲清楚哈,如有不对还请指正~

15分

#6

试试fastCSharp的代码生成方式,不过没有在mono/unity的真实环境下测试过。
15分

#7

另外客户端确实不需要太多连接,一个足矣,而且效率最好。

#8

回复7楼:

非常感谢!但是目前测试进入尾声,只剩一个性能指标了,不好随便更换,希望再等其他人给点意见啥的~
实在不行我会考虑你的建议,非常感谢!

#10

楼主你的问题解决了吗、同样碰到你说的问题

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#客户端用protobuf序列化的时间很长
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!