ex_interp参数中文最详解释
很久以来,有关ex_interp的争论就不断,目前国人的对其的认识,我想大多数都是这么认为的:Value已经
修正了有关ex_interp的BUG,ex_interp 0.1 和0.01都是合法的,并不会造成不公平现象,而且相比之下
ex_interp = 0.01更占便宜。所有这些认识,我想应该都是源于OGC在《向CPL新加坡致敬》中引用的关于
ex_interp的解释,那篇解释之前已经被包括我在内的无数人看过,也在心中植下了根深蒂固的印象,OGC还在
寻找原作者署名吧?不要找了,原作者是个外国人,如果真有人来了那一定是假冒的……
其实,在那篇文章里,对于ex_interp的解释是基本正确的,呵呵。
最后,作者额外的解释了两句:
另外一点,如果你想你的cs更象“街头混战”一样的话,用另外的话说平滑而无顿挫感,那么我建议你将
ex_interp设定为0.1。
不过如果你想你增加你的准确度的话(子弹打在你所实际瞄准的位置),那么就把ex_interp设定到最低
值。
这么一句话,让每个人都以为ex_interp 为0.01占到了便宜。没错,应该是这样,服务器通过插值运算
出来的人物运动只是模拟而已,也就是说,如果你的木仓刚好在模拟运算欺骗了你的眼睛的同时开火的话,子弹
是注定打不到你想打的人的。
不过请看Gotfrag上John Mellin写的文章《Cs 1.6 NetCode Explained》(付费内容)
ex_interp:Set this variable to 0 and nothing else. Counter-Strike will automatically
set your ex_interp to 1/cl_updaterate (i.e. your console will say: ex_interp forced up to
xx msec?. This is because the time in between each packet is exactly 1/(the # of updates
per second), so this is how long you want your client to interpolate. Adjusting your
cl_updaterate will automatically adjust your ex_interp (when ex_interp is set to 0). I
recommend only changing your cl_updaterate, and letting Counter-Strike set your
ex_interp. You cannot set this command lower than 1/cl_updaterate anymore, and setting it
higher is an exploit. Using a value above 1/cl_updaterate forces you to shoot behind the
actual model displayed on your screen, which should be considered an exploit. For
example, if you use cl_updaterate 101, the correct value for ex_interp would be 1/101 =
0.009 (9 milliseconds), but by using the default value of ex_interp 0.1 with this high
cl_updaterate, the aforementioned exploit appears.
Recommendation:
ex_interp 0.
这么一段话的意思是:
ex_interp:
把这个值设成0,CS会自动把你的“ex_interp”设成“1/cl_updaterate”(控制台会告诉你
“ex_interp”被强制设成XX毫秒。原文“ex_interp forced up to xx msec”)。这是因为两个数据包之
间的时间间隔就正好是1/(每秒更新次数),这就是你需要客户端做出插值预算的时间长度。调整
“cl_updaterate”会自动调整“ex_interp”(当“ex_interp”设成0的时候)。我建议你只修改
“cl_updaterate”,而让你的CS来自动修改“ex_interp”。你现在不能把“ex_interp”设置的低于
“1/cl_updaterate”,而把它设高则导致了你射击对手的时候不得不瞄准出现在屏幕上的人的后面,这种行
为通常被认为是exploit。比如,如果你的“cl_updaterate”是101,你“ex_interp”的正确值就是
“1/101=0.009”(9毫秒)。而使用默认值0.1就形成了前面所说的exploit。注意到这里有段:而把它设高
则导致了你射击对手的时候不得不瞄准出现在你屏幕上的人的后面。
这段话看起来是不是很别扭?字面上看还是设高了吃亏嘛,呵呵,别着急,这是这个外国人没解释好,一
会我会给出中国人能看懂的解释。现在肯定有人想问,什么是exploit?我是搞计算机的,一般在网络攻击
中,exploit是代表“溢出”,“漏洞”的意思。
再看cpl的相关规则:Any competitor or team accidentally utilizing ANY exploit or bug in
a map or game will forfeit that round and all remaining rounds for the half. Players need
to be responsible for their actions in regards to know map or game bugs/exploits.
大概意思是:
任何人利用任何BUG或exploit在一副地图或者一场比赛中将被判当局以及该半场内之后所有之局为负,选
手们有责任了解在地图和游戏中什么样的行为可能导致BUG和exploit的产生。
所以,如果我们把BUG翻译为错误的话,那么可以把exploit看做是漏洞。但是,在这篇文章里,还是没有
详细的解释清楚,为什么ex_interp 设置高了会是一个exploit?而Using a value above
1/cl_updaterate forces you to shoot behind the actual model displayed on your screen这句话
真是只有鬼才看的明白。要怪就怪Value,从来没有官方声明能把这些参数完全解释清楚,是否那些做程序的
人自己都不玩CS呢?这虽然可能有人知道,但至少你不知道,我不知道,我们中国人也都不知道。即便是在国
外,大多数的人的相关认识也是通过以上2篇文章以及由这2篇文章衍生出的其他一些文章建立起来的。但是所
有的文章,都没有给出一个可以让人看懂的解释,看完所有这些文章以后,我们的疑问反而越来越多,究竟
ex_interp的修改对游戏的效果有没有影响,为什么有人会说,ex_interp 高是'Indeed Cheating'?
那么现在我来对ex_interp做个更详细的解释,似乎好像应该仿佛国内外还没有我这么对ex_interp解释
完全的文章,希望看了这篇文章之后,你对ex_interp的认识会超过70%以上的老外,也许他们明白怎样修改
ex_interp会导致犯规,但是也未必清楚真正导致犯规的原因。
其实所有的分析都基于以下几个已经确定的内容(请注意,这里只讨论1.6,1.5由于存在bug,无法用以
下说法解释)。
已知:
1. ex_interp设置为0即为一个开关,作用是ex_interp开始根据你的cl_updaterate数值进行全自动调
校,我们可以认为,此时的ex_interp实际值即为value的推荐值,也是理论上最适合的值。
2.cl_updaterate 的概念为每秒从服务器接受的数据包数量。这个数值能否正常发挥其作用,取决于2个
方面,一个是服务器的FPS是否大于你的cl_updaterate数值,一个是服务器端是否设置了
sv_maxupdaterate 大于或等于你的cl_updaterate数值。
3.ex_interp的实际数值决定了插值运算的强度,ex_interp越小,在你看到一个人的完整运动轨迹之
中,由插值运算所产生的比例越小。
4.ex_interp的数值(0.1,0.01等)实际上可加上一个单位s,其实0.1就代表0.1秒。
我们来对比一下两种情况下cl_updaterate和ex_interp的关系。
当cl_updaterate 为100时 ,ex_Interp最佳值为0.01 即0.01s=10ms
当cl_updaterate 为10时, ex_interp最佳值为0.1即0.1s=100ms
我们可以注意到,第一种情况,100X10=1000ms,第二种情况10X100=1000ms。
而1000ms=1秒。你可以试一下别的数值,最后的乘积一定也是1000ms。
注意到cl_updaterate为每秒从服务器接受的数据包数量。
所以我们可以这么解释,当客户端每接收到一个数据包之后,可以确定一次你的对手的真实位置。自你接
收到第一个数据包开始xxms之内,你看到的对手运动轨迹为插值计算所得,这个xx=ex_interp的数值。举例
说明,当clupdaterate 为100时,每隔1/100=10ms你接收到一个数据包,所以ex_interp 设置为10ms为最
合适的数值;因为刚好10ms之后你又能收到第二个数据包,从而完美的实现衔接过程。同理cl_updaterate为
10时,ex_interp=0.1就是最佳的数值。
现在我们来用目前争议最大的wNv和Fnatic的战斗过程来举例:
Fnatic 的设置:
cl_updaterate=100,ex_interp=0.01=10ms
wNv(或者说wNv-Kin'z)的设置:
cl_updaterate =100,ex_interp=0.1=100ms
两者都是每秒接收到100个数据包,但由于wNv的ex_interp设置为100ms,所以当kin'z接收到第一个数据
包后,客户端根据插值运算虚拟计算出了100ms内对手的可能行为。
而此时Fnatic队员的cs客户端只虚拟计算出了10ms内对手的可能行为。
现在有人会想当然的认为,这样wNv队员不是'提前'90ms预知对手的行为了?实际上这也是John Mellin和
被其影响的相当多数外国人的想法。然而我要说这种想法是错误和主观的。首先,客户端虽然“预知”了对手
未来的行为,但是操作客户端的玩家却无从知晓,客户端要想反应出敌人未来100ms的情况,同样需要花100ms
的时间。其次,上面所说的情况其实根本不会产生。
我们注意到此时双方的cl_updaterate 都为100。这意味着,在接收到第一个数据包之后10ms,客户端将
接受到第二个数据包。对fantic这一方而言,第二个数据包处于刚好衔接上的状态。对wNv这一方而言,虽然
在第一个数据包到达之后,客户端虚拟出了未来100ms内对手的行为。但是10ms后,第二个真实反映对手位置
的数据包到达了。
我们可以想象出此时程序的2种处理方式,如下:
第一,忽略多出的90ms虚拟计算数据,采用到达的真实数据。
第二,忽略第二个数据包的内容,继续采用虚拟的计算数据,直到第10个数据包到来。
第二种情况是不科学的,也不可能是value实际采用的,因为如果按第二种情况处理的话,其实
cl_updaterate 10和cl_updaterate 100在ex_interp为0.1的情况下没有任何区别。你可以去一个服务器里
把cl_updaterate 改成10 ,试下你的感觉……
那么我们可以认为程序是按第一种模式运行的。
于是我可以提出我的结论:
在cs1.6中,当cl_updaterate数值足够且网络状况良好的情况下,ex_interp为0.1或ex_interp为
“1/cl_updaterate数值”这2种设置并没有实际区别。采用其中任何一种设置均获得近似相等的效果,并不
存在所谓的不公平性因素。
那有人要问,为什么value把最佳值设为'1/cl_updaterate数值'而不统一设定为0.1?
我想,那是一个最优数值,使用这个数值,可以避免cpu时间被无谓的浪费要知道cpu计算数据量的不同耗
费的时间也不同,在这里也存在一个'延迟',而且可能还会略微的影响FPS。所以我在结论中用了一个'近似相
等'。至于影响的大小是可以完全忽略不计还是可以微微感觉的到,这就不在本文研究的范围之内了。在平时
进网络服务器打比赛或混战的时候,使用ex_interp 0.01等参数可能会导致人物一跳一跳,这是由于互连网
络连接状况不稳定, 如果产生了lost(丢包),choke(阻塞),那么使用ex_interp 0.01等参数就有可能出现
插值运算结束后不能衔接上下一个数据包,这样反映出来的效果就是人物会跳动。
最终我依然推荐平时将你的ex_interp设置为0,而cl_updaterate设置为60-100,比赛时设置为
ex_Interp 0.01,cl_updaterate设置为100。
另外,有人抱怨在国内的大多数服务器中无法修改ex_interp,这里呼唤一下所有粗心的服务器架设者
们,请到服务器安装目录下的cstrike\addons\wwcl子目录下修改下wwcl的配置文件。具体过程:首先查看
wwclconfig.cfg确定你现在用的wwcl模式。注意前面没有//注释的就是目前你采用的wwcl模式,然后修改该
模式对应的config文件,以ex_interp做关键字查找到锁定ex_interp的那一行将其删除,并把brightness参
数由原先锁定的1修改为3。
而对于玩家而言,也不必过于担心此事,如果你能习惯ex_interp=0.1,那么你就能习惯
ex_interp=0.01 。
关于ex_interp,我想以上已经解释的足够清楚了。