- UID
- 5122
少将
- 积分
- 50897
- 经验
-
- 点数
-
- 油豆
-
- 荣誉
-
- 在线时间
- 小时
- 注册时间
- 2004-10-8
- 最后登录
- 1970-1-1
|
发表于 2010-5-14 12:18
|
显示全部楼层
来自:LAN
第二篇:关于弹道与ex_interp的关系
我经过查找资料及亲身验证,可以很肯定的说,平常大家所说的弹道很漂,画面很卡的原因绝对与ex_interp有直接关系(当然前提是fps能稳定在100),究竟最理想的弹道是怎样的呢,你可以在局域网自己建主进去感受一下就知道了,那就是最理想的的状态。可是平时我们一般都是登录服务器进行游戏的,所以弹道是否理想,决定于服务器的设置及质量,同时需要客户端正确的网络参数配合才能在到最优化。像在局域网中服务器是经过加速并且是以sv_maxupdaterate 100来架设的,客户端是以rate 25000,cl_updaterate 100,cl_cmdrate 100,ex_interp 0.01来设置的情况下,也可以达到最理想状态。可是在互联网上的服务器,绝大多数无法达到最理想状态,所以我们必须通过一定的途径找出客户端的最佳设置以达到所能达到的最优状态。
那究竟ex_interp有什么作用,大家可以自己搜索一下,不过大多数应该都知道的是这个值设置高随机性会高一些,设得低会更准确一些,但是如果服务器无法满足我的设置,客户端这边人物的动作就会闪烁,不流畅。据我自己的感受,这个值设得太高,我以前设置为0.1(因为不习惯0.01时人物的闪烁),会明显感受到滞后感,就是已经按键了,但感觉子弹不是马上打出去的,而且准心恢复也慢了一点,而究竟是什么原因,我也弄不明白,当然这不是今天的重点,今天的重点是找出最合适的ex_interp值。在网上有人说过会根据网络带宽,或是根据PING值来设置,其实那是完完全全错误的,因为CS的下传速度仅仅10KB以内,上传也就6KB以内,所以以现在大家的宽带来讲绝对是可以完全应付的,不会因为把参数设得高了点就会造成ping值飙升的,除非是线路有问题或是上网高峰造成的拥挤。对于ex_interp这个值理论应该是越小越好的(最小0.01),可是我前而说过了,如果服务器的updaterate无法满足客户端ex_interp,虽然弹道状态可以达到最优,可是客户端敌人的移动动作不连贯,多多少少会影响射击,所以如果不在意的话,你可以在任何情况下都使用0.01这个值。我在网上看到很多人会使用类似0.05或是0.075等值(迪酷版的CS里的H菜单是这么设置的),这些值都偏大了,至以原因,一会儿就会知道。好了,现在我们进入重点吧,应该如何设置才能把所有的一切调到最佳值。
1。在控制台里输入“net_gragh 3”,调出网络状况信息;
2。在控制台里输入“rate 25000"或是"rate 20000",其实两个没什么差别,因为CS最大的下载流量也不过10000左右,上传6000左右,所以对于cl_rate 这个参数我这里也没要求大家改,因为默认的cl_rate 是9999,完全够用了。
3.在控制台里输入“cl_updaterate 100”和“cl_cmdrate 100",其实100和101效果是一样的,因为在半条命引擎里的帧上限就是100,设高于100的都自动换成100;
4,输入”ex_interp 0",ex_interp为0的意思是让程序根据cl_updaterate 来计算出最匹配的ex_interp值,其换算公式为:ex_interp=1/cl_updaterate,这也是为什么我上面设置cl_updaterate使用100的原因,如果用101算出的interp值是1/101=0.009,而不是0.01;
5,这步是最关键的地方,这个时候我们进入服务器,查看屏幕下方的net_gragh信息的最后一行,即是loss=? choke=?的那一行,如果loss不等于0,那代表着你的上传达不到cl_cmdrate设置的速率,因为决定cl_cmdrate设置的是服务器与客户机FPS较低的的一方,现在大部分机器fps稳定在100应该没有问题,而服务器方面,我想现在的服务器都应该是经过加速的,一定是会大于100fps的,所以按理说cl_cmdrate 设为100应该是没有问题的,除非是你的网络无法稳定的提供6k的上传速率,或是服务器网络忙无法接收由你发出的6k数据,如果真是这样的话,试着降低cl_cmdrate直至loss为0,不过我是没有碰到过这种情况,我这边无论进任何服把cl_cmdrate设成100都没问题。所以网上的服务器大多数的情况是无法达到updaterate 100 的要求,而且有绝大部分服务器并没有专门调过sv_maxupdaterate 这个参数,也就是说其使用了默认的30这个值,即使有的服务器有调成100,但由于服务器端硬件或网络的关系,并不能保证在任何时段都能达到最大值。其实以我的感觉,服务器能稳定在默认的30,我已经觉得弹道很舒服了。所以你可能已经可在猜到了网络设置的关键就在这里了,就是如何判断一个服务器在某一时刻的updaterate稳定值,在服务器端网络状况良好的情况下,这个值应该就是服务器的sv_maxupdaterate一致,当然我们都不必去关心这些,刚才提到出现loss,我们就调cl_cmdrate,如果现在现在出现choke,即choke值不为0,就说明了我们设置的cl_updaterate 100高于服务器所能提供的,当然有的时候也可能是客户端的网络出现问题,我前面也说过了cs最高的下行流量也不过10K,所以是客户端这有的原因的可能性比较低,但不管怎样,这都说明了你不能从服务器得到每秒100次的数据更新,这时你应该试着降低cl_updaterate的值,每次试着将数字减少10,直至choke为0,当然,并不是要求其绝对为零,只要大部分时间内其为0就是正确的,因为服务器的updaterate有时是不太稳定的,偶尔会突然很低,所以choke偶尔的不为0并不代表着updaterate达不到那个值,只要choke大部分时间内为0,就代表着此刻服务器的updaterate就是cl_updaterate所设置的值。其实这里还可以有另一种调法,只要我们设置的ex_interp值不大于"1/服务器updaterate",弹道都是此刻此服务器所能达到的最优状态,之所以要把interp调到最合适的数值,无非是在保证弹道的情况下,尽可能的让人物的移动更平滑,所以我们可以不关心choke值,往下调低cl_updaterate的值,ex_interp在设为0的情况下,其值会随着cl_updaterate的改变而根据“1/cl_updaterate"这个公式由系统自动调整(注意,如果cl_updaterate是由小至大设置,ex_interp不会自动调整,你必须在每次更改updaterate时,再输入ex_interp 0来让系统对它进行更正),当每次interp变大时,你会发现人物的移动的闪烁感越来越不明显了,只要达到一个你可以接受,让你觉得人物移动已经很平滑,不会影响到你的射击时,你就可以不用再往下调了。
6.输入“ex_interp 0”,此刻系统就会把ex_interp的值设为1/cl_updaterate,也就是针对此服务器此时刻的最佳设置,也就是此时即能让弹道达到应有的最优状态,又能保证客户端画面平滑。我前面说过,大部分服务器都可以稳定在30的updaterate,如果按照30来计算的话,ex_interp=1/30=0.033,也就是说,对于绝大多数服务器来讲,ex_interp的最佳值是在0.01至0.033这个范围内,所以我前面说过的0.05或0.075这些值都明显偏大的原因,而对于默认的0.1更是大得离谱,也许对于一般玩家来说,可能感觉不出其中的差别,但对于有一定水平的玩家来说,其差别真的是非常大的。
好了,现在给大家一个参考设置
线下专业的比赛(指的是经过专业搭设的局域网服务器)可以使用下面的参数:
rate 25000
cl_updaterate 101
cl_cmdrate 101
ex_interp 0.01
线上对战,如果是比赛服,应该sv_maxupdaterate 100,只是可能无法达到最高值,可以这样设置:
rate 25000
先cl_updaterate 100 然后以10为单位往下调找出最佳值
cl_cmdrate 101 (没有loss就不用调低了)
ex_interp 0
线上混战,基本上混战服的sv_maxupdaterate都使用默认的30,即使有调过,但是由于混战服人数太多,基本上服务器端很保证较高的updaterate,所以基本上能达到的上限也不会比30高多少,所以一劳永逸的做法是,所有的混战服你可以认为其updaterate就是30,那么可以这么设置:
rate 25000
cl_updaterate 30
cl_cmdrate 101
ex_interp 0 or 0.033
另外,一般在网吧几个朋友一起娱乐,从游戏里创建房间(浩方平台也属于此类)的,只要没有特意去调sv_maxupdaterate这个参数的,也可以用这个设置。如果你是个追求极致的人,即使是打混战的时候只要不怕麻烦可以采用第二种设置,像我这边就在一个同城网吧服务器,大多数时间updaterate可以达到80,那个弹道真的好的没话说,而且可以很肯定的说,cs1.6已经对事件判定机制做了一定的优化,只要弹道不错,ping值不同的人之间的优劣势已经不太明显了。
哈哈,当然还有最省心的设置,就是不管任何情况,都使用线下比赛的设置,或许人物的动作在眼中不平滑,但在心中却是平滑的,不过这不是本文所追求的。
好了,我说完了,你可以按照我的方法,看看效果怎样,希望对你们有所帮助。
进行一些补充
我再次分析一下,为什么ex_interp不同会造成弹道的不同。
因为我们知道CS运行的机制是不停地收集玩家的事件信息(比如位置信息,开枪信息等)然后进行比较确认后再将确认结果发给客户端,例如,服务器会根据某人的位置及射击角度,以及对方的位置等信息进行比较来确认此人是否击中对方,所以一切在客户端的显示的信息都必须被服务器确认才算数,或许大家有这个经验,在PING不好的情况下与人对狙,明明已经显示击中对方,对方已出现掉血的画面,可是死的却是自己,而查看对方血量还是100,这就是说你击中对方这个事件虽然在客户端处出现,但是到在服务器端时,服务器端的记录是对方已经先击中了你,所以击中对方的这个事件被判无效,服务器会重置你这边的状态,这也是为什么在PING不好的情况下,经常会发生在移动中与敌人对枪时,会无缘无故的弹回先前的某个位置,这因为经过服务器的确认,其实你在那个位置上已被击中,服务器把你的状态重置回去了而已。
好了,现在我们大概知道服务器的运作方式,那我们看一下不同的ex_interp,到底对我们都有什么影响。为了把问题简化,先假设服务器到客户端以及机器处理数据的延迟都是0,即无延迟。
第一种情况,服务器稳定在最佳100 updaterate,有两台客户端,fps,cl_updaterate和cl_cmdrate都是100,不同的是一台ex_interp是0.1,另一台是0.01。对于0.1这台可以从服务器端每秒收到100次数据包(平均10ms一次),但是每次收到的数据包的信息不会在下一帧显示出来,因为ex_interp 0.1决定了它必须等到0.1秒(100ms)后才显示出来,例如,它在0ms时收到第一个数据包,可是这个数据包所包含的信息不会在第一时间(收到数据包的10ms后)在客户端显示出来,而是等100ms(0.1秒)后,即相当于收到第11个数据包的同时,才在客户端处显示出来,而对于0.01这台客户端,当它收到一个数据包时,会在0.01秒(10ms)后显示出来(10ms是CS反应的最快时间,因为cs的fps最大为100,即最快每10ms更新一帧画面),所以现在假设两客户端都在50ms的时候开了一枪,在60ms时两客户端都把这个信息发到的服务器端,服务器会在第一时间,即70ms的时候将确认信息发回两客户端,而两客户端的分歧就在这里体现了,0.1这台客户端虽然与0.01客户端同时在70ms时收到服务器发回的确认信息,可是它必须在170ms的时候才在客户端显示出来,而0.01这台客户端却是在80ms的时候,就显示刚才数据包里的信息,所以说0.1客户端总是会比0.01客户端慢90ms,虽然这在服务器判定时不会有差别,因为服务器在判定开枪命中时,会把客户端的ex_interp值考虑在内的,但在客户端上会有很大的差别,你会发现0.1会令你所有的动作都变慢了,例如开枪变慢了,准心恢复变慢,尤其在ak快速单点时,或是压枪扫射时对于弹道的控制,都无法实现自己建主与POT练枪时的那种感觉了,而0.01这台确是正常的。刚才我说过了0.1与0.01在服务器上的判定是一致的,只在在客户端的表现不同而已,虽然这里的具体运作机制究竟如何没办法弄明白,我的猜测是,可能客户端ex_interp的不同,会造成服务器端判定的不一致性的增大,从而增加了重置客户端数据的次数,所以各种专业langame会强制所有玩家的ex_interp为0.01,因为局域网服务器可以满足这一设置。
那么我们来看第二种情况,这种情况中,除了服务器的updaterate是50外,其它的假设都和第一种情况一致。这种情况下,两客户端在0.1秒内从服务器收到的数据都是5,由于0.1这台是在0.1秒后才在客户端进行显示,所以此时,它已经具有5个数据点,客户端会通过这5个人物的位置信息模拟出10个位置信息(为了满足10帧的画面),所以在0.1这台机器显示的人物移动轨迹是平滑的,但与服务器里的轨迹不是100%一致的,但应该是非常接近的。而在0.01这台客户端,它在0ms时收到一个数据包,在10ms后客户端显示出来,而在10ms时,却收不到服务器的数据包,所以在20ms时,客户端这边是无法显示人物位置信息的,所以这个时候我们使用0.01时,客户端里的画面是不平滑的。然后我们再看两台机器的动作延时,0.1这台是100至110ms秒,而0.01这台是10至20ms,所以不管你怎么设,你都无法达到10ms的延时。现在假如有第3台客户端,其ex_interp为0.02,那其动作延时也是10至20ms,即弹道还是可以达到最优的,同时每20ms内的一帧缺失的人物动作客户端也会模拟出来,所以此时不但保证了弹道,而且确保了人物动作的平滑,为ex_interp的最优设置。
所以结论是,弹道的好坏决定于服务器updaterate的状态,而客户端ex_interp设置的正确与否,决定了是否能最好的弹道设置出来,而且保证画面的流畅度,所以,如果只使用默认的0.1这个值是极不推荐的,但如果一成不变的任何情况下都使用最高设置即最低值0.01,对于弹道来讲是有好处的,但是要想弹道与画面流畅都达到最优状态,应该使用最优值。也就是可以通过我上面所讲的方法进行。 |
|