序:
玩也要更出色一些!
色彩,纹理,光影等是CS地图里非常重要的部分,在你制订战术和位置的时候你应当考虑每个拐角和阴暗角落。不过个人技术应该在你瞄准射击的时候体现出来,即我们所说的指哪儿打哪儿。有时候觉得自己瞄的很准了,可是还是打不中!其实也许不是你自己的问题,可能是cs里本身的一些问题导致了你不得不沮丧的看着其他玩家作战,我写这篇文章的目的在于让更多的人了解cs多一点,瞄的准一点,反应比原来“快”一点!更公平一点!
本文是针对一些刚刚开始玩cs不久或是对netcode不熟悉的cser。
鉴于笔者水平有限,有不足的地方还希望各位指正。
网络代码(NetCode)
NetCode,因为不知道确切该叫做什么,所以只好直译了。
游戏服务器收集多人游戏里的所有信息,客户端发送诸如:移动、开火等数据包,服务器接收数据包,并进行分析玩家的位置,是否击中目标,以及是否爆头?然后再发送相应的信息回客户端(玩家)。网络代码的目的就是来完成上面的任务并且让玩家能够流畅的游戏。
Half-Life中网络代码的瑕疵
玩过1.1或更早版本(可能和Quake的引擎一样)的玩家会发现Ping低的玩家会打的非常的准。在现在的网络代码中,Valve试图让CS占用更窄网络带宽,因此他们改变了客户端与服务器之间互相更新的时间间隔,更少的相互间的通讯自然就减少了对带宽的需求,重要的是,恰恰因为这个改动,服务器客户端之间产生了迟延。
在服务器客户端之间产生了迟延情况下,玩家会变的非常的卡,卡,卡!!!所以,Valve有加入了interpolation(插值?!就是我们常谈的ex_interp),其作用就是让cs更流畅(你可以设置把ex_interp设置成0试试),实际上就是用Interpolation来记录0.1秒(假设ex_interp为0.1)前玩家在游戏里精确位置的,然后再用ex_correct解析移动后的两点最佳的线路,实际上在这两点间的移动是等速度的,所以,用interpolation就是让玩家实现从A到B的平滑移动,唯一例外的是有一个很大的数据包被丢弃了,例如在你的ping相当高的情况下,由于玩家落后server太多了,所以不得不把他给传真到他应该在的位置上。这样的设计即使在丢数据包的情况下也不至于让抱怨cs太卡,带宽太窄!
要知道关于ex_interp更详细的解释,请看:http://gameport.qd.sd.cn/wenzhang/explain_..._ex_interp.html
在老的网络代码下HL服务器客户端之间的通讯是是基于客户端的FPS,由FPS来决定发送多少次更新到服务器,现在的网络代码就截然不同了!
为什么我在高ping的情况下仍然可以很流畅的游戏?!
我想你会注意到即使在你的ping非常高的情况下你按下开火键时,你的枪的反应是同步的!不要被这种假象所迷惑,因为实际在新的HL引擎下,所有的视觉效果都是在客户端计算完成的,你的枪的同步反应只不过是你的pc的反应,那只是一些贴图而已,只有服务器知道你的子弹去了什么地方,是否击中了,直到当服务器把信息传回给你,你才知道确切的结果。所以,有时候(高ping情况下),你觉得自己的枪已经很准了,可还是打不中的原因就在于客户端华丽的视觉效果欺骗了你的眼睛。Sad but True!
默认的lag
服务器端有1000ms / 20 = 50ms的lag
客户端有1000ms / 30 = 33ms 的lag
ex_interp = 0.1
即100ms
50+33+100 = 183ms
总计183ms
最后得到的你的响应时间为你的ping+183。
Valve加入了lag补偿,服务器接会检查其收到的每个数据包,并进行平衡等。
可以修改的几个参数,用来减少响应时间。
Cl_updaterate
默认为:20
你可以在20到101之间的范围内调节,如果你的带宽够的话,你可以将其设置为101,用来检测是否合适的办法就是在控制台里输入net_graph 1(net_graph 3也可以),如果你发现很不稳定的话,就降低其值。
cl_cmdrate
默认为:30
建议:等于你的平均FPS(切记HL里最大的FPS是100)或者是能被FPS数整除(在你的带宽不够的情况下),如果你的FPS稳定在99,带宽有足够,就设置为101吧。
ex_interp
默认为:0.1
建议:0.05-0.1。一个争议比较大的参数,不知道在1.6里是否会被固化而无法在控制台里修改了,但是现在来看,在cs1.5里在上面的范围内修改是没有什么问题的。但我个人建议为0.1我以前试过0.05,总是瞄不准。呵呵,很奇怪Potti可以在这个参数下表现的那么出色。
cl_lc
默认:1
建议:1
如果设置成0就会丢弃lag补偿,只在lan game里有用,而且ping要相当低。
服务器端如果sv_maxupdaterate是100的话,那么现在我们来对比一下究竟可以降低多少lag?
服务器端(sv_maxupdaterate 100,客户端的cl_updaterate 100)
理想状态下为:1000ms / 100 = 10ms
客户端:
cl_cmdrate 100
1000ms / 100 = 10ms
Interpolation lag:
ex_interp 0.05
总计为:10+10+50=70ms
与原来的183ms有了113ms的提高!这就意味这你的反应速度比原来提高了113ms,而cs里胜负往往就是在这一瞬间!
关于choke!
客户端可以向服务器发送下一个数据包的时间是:
1,当前时间+1/cl_updaterate
2,当前时间+(上次发送的字节数/rate)
根据我个人的理解就是cs客户端里的塞车!就是你的指令被阻塞住无法发送了!所以,如果你的带宽不够的话,服务器里的人越多、cl_updaterate的设置越高就意味着越多的choke!如果rate的设置越低,你得到的choke就越多!想象一下,如果你发送的开火指令突然choke了会怎么样!!!
choke也可以用net_graph 1(or net_graph 3)来进行观察。
写在最后
上面所述是基于www.geekboys.org上SK|bds的《Half-Life Netcode Explained》以及个人平常积累的一些知识,因为如果用默认的netcode的话,如果你的机器可以跑到90fps以上,但每3帧才有1帧是真实的,这样对你来说岂不是很浪费?!你的水平的提高也会比你想象的要慢很多,作战时你就已经处于劣势了。正如我开头所提到的,这篇文章的目的就在于让更多的人了解cs多一点,让大家瞄的准一点,反应比原来“快”一点!更公平一点!但我不希望出现一些netcode/config的cheaters!谢谢你有耐心看完我的文章。