■ 写在前面:
最近做的项目,都是需要极低延迟的游戏。所以,哪怕是10毫秒的延迟,我都耗费了十几天的时间,努力降低下来。最终研发出一套极低延迟的网络通信框架。下面把一些研究结果,和心得写下来,与大家分享。原创不易,研究更不易,转载请注明出处。
■ 发数据
首先, 调用发送数据代码, 例如在update里进行数据发送,并不延迟。
多次测试,从打印日志可以看到,从发送,到确认已经发送完数据,最多消耗2毫秒(一般是1毫秒内),几乎没有延迟。
■ 收数据
下面,有意思的来了:
网络延迟:网络延迟就是,数据往返行程时间RTT(Round-Trip Time)。也就是ping时间。
服务器处理延迟:绝大多数情况下,服务器是要处理数据的,而不是简单回传。我写的高性能架构,大概能控制在4ms以内。
Unity处理延迟:
1,无论是多线程(或者协程)作为接收网络数据的模块,最后还得返回Unity主线程里去处理。也就是落实到FixedUpdate() 或者Update()函数里。这个部分起码消耗1毫秒。
2,要等FixedUpdate() 或者Update()的下一次调用。如果游戏目标帧率是30帧的话,那么最长处理等待就是33毫秒,最短1ms。
3,实际的逻辑处理,一般会跨游戏体调用,也就是回调,或者委托,又需要起码1毫秒。
下面计算乐观延迟和悲观延迟
乐观延迟 = 网络延迟(20ms)+ 服务器处理延迟(4ms)+ Unity最短处理延迟(3ms) = 27 ms
悲观延迟 = 网络延迟(200ms)+ 服务器处理延迟(4ms)+ Unity最长处理延迟(35ms) = 239 ms