最近因为项目接触到客户端网络底层,现在是用TCPClient来做的,看起来代码很少;
但是表现不流畅,怀疑是TCPClient性能或者我们用的不好;
最近想要用socket开线程来做.
大家有什么建议.
我是个C#新手,对C++比较熟悉,一般来说单独一个线程来接收网络消息;一个线程做个生产者-消费者队列来接收消息,并消化掉.
另外是在unity3D下做的,大家有什么好的建议呢?
我怎么觉得你的不流畅是动画效果不流畅啊?
毕加索画的画你却找聂卫平看看哪一笔下笔有问题。
TCPClient和Socket你要不是几十万上百万的连接测试能有多大差别呢?
感觉就是你转语言过来,还没有把相应的接收消息,另一线程处理消息的机制在NET里面实现,
你写网游的数据传输应该不会太多太频繁,问题还是出在接收消息后如何处理上。
跟服务器的ping消息 时延很不稳定
@hailong:
那是网络问题了,找中国电信吧。或者如果是你的服务器托管,就换个机房吧。
或者如果是你用了云,那就换个云吧。
我在同城电信机房,一般PING时延都是10以内,通常是2、3这样。
如果是异地,通常也就是40~50左右。如果是港台,大约都是在150左右,有时候运气好走的通道顺畅就能在50左右,刚刚测试了一把,港澳回大陆的PING居然90%在50,偶尔一两个在120,这就相当理想了。
@爱编程的大叔: 我说的ping是指的程序内部发echo消息的时延,并不是机子之间的ping
TCPClient就是对socket的封装吧,会不会是线程问题不流畅的话
线程问题 比如呢?
TCPClient 封装的socket,特点使用起来方便简单,但性能差。如果对性能有要求,应使用socket。
性能差?哪方面?
考虑性能的话用socket吧,就是相对复杂了一点。
要提高客户端性能,你可以有两组方法使用:
1:
TcpClient::BeginConnect
NetworkStream::BeginRead
NetworkStream::BeginWrite
2:
TcpClient::ConnectAsync
NetworkStream::ReadAsync
NetworkStream::WriteAsync
然后记得同步对 Read 或 Write 的调用,也就是说每次只有一个线程调用 Read 或 Write 。然后你还可以通过 NoDelay 等属性来自定义发送策略。对同一个地址和端口,保持 TcpClient 的实例最多不超过 2 个,通常一个就足够了。
unity里只能用第一组函数
call ,this is bug!
嗯?
看名字
看名字干嘛?