ViVa 发表于 2005-10-25 16:06:36

【推荐】ex_interp参数解析(Jordan@newsmth)

呵呵,改了又改。参照了Valve对CSS网络代码的解释(点击查看 )以及gotfrag上一篇收费的解释ex_interp的文章。

(1)ex_interp后面跟的0.1和0.01是什么意思?

  如果LAN条件下电脑甲用0.01,电脑乙用0.1。当server送出数据包A,由于ping值差别很小,基本在1ms左右,可以忽略不计,所以此数据包A将同时到达电脑甲和乙。那么这时候在两条电脑上会出现什么情况呢?结果就是,等过了10ms,在电脑甲的显示器上才出现数据包A描述的图象;而再过了90ms(100ms时),在电脑乙的显示器上才会出现数据包A描述的图象。所以其实这里的0.1和0.01的单位就是秒(s):0.1=0.1s=100ms;0.01=0.01s=10ms。

(2)那在这儿10ms或者100ms内这两台电脑都做了些什么呢?

  很简单,数据插值。我们知道server只能向电脑发出不连续的数据包。在LAN里,updaterate采用的是最大值100。亦就是1秒内server向电脑发出了100个数据包,每10ms发出一个。如果我们的电脑只是按照这些数据包来生成屏幕上出现的图象,尽管10ms很短很短,敏锐的人眼还是足够让每个人都会觉得图象及其不连续,这就是必须做数据插值用来填充两个数据包间那10ms空白的根本原因。你的电脑正是通过这0.01s或者0.1s来收集足够的数据进行插值。

(3)10ms和100ms插值的不同?

  如果熟悉插值的会知道,插值的方法有很多,如果只有两个点,那只能做简单的两点线性插值,也就是两点成一线段。不断做两点线性插值结果就是一条由很多线段组成的折线。如果有N个点,那么就能采用高阶函数做插值,比如用N-1次多项式做插值,结果是一条很光滑的曲线。

  假设server最开始向电脑发出的数据包为A,之后是B、C、D、E和F、G、H、I、J、K,间隔为10ms。电脑甲和乙将同时收到A,但是它们不会立刻把A画出来。

  对于采用ex_interp 0.01的电脑甲来说,它要等10ms后收到了B时才开始把A图象在屏幕上画出来,再等到10ms后,电脑才会画B图象。而对于在画B图象之前那10ms的空白,电脑甲用已知的A和B这两个数据点通过两点线性插值来计算并在屏幕上画出。对于采用ex_interp 0.1的电脑乙来说,它要等收到A数据包100ms后,也就是当收到了K数据包的时候才开始画出图象A。而对于在A~K这些离散数据之间10段空白,电脑乙已有11个数据采样点,这样它就可以通过高阶函数来进行非常光滑的数据插值。

  所以,ex_interp其实就是给出一个采样时间,10ms和100ms的差别就是100ms的图象更加平滑,因为采样数据点多可以用高阶插值函数。这就是为什么强调公平的CPL在规则里要求所有人的ex_interp必须相同。

(4)server如何协调不同的ex_interp?

  正像前面说的,尽管电脑甲和电脑乙同时收到数据包A,但是电脑甲要在10ms的时候才画出图象A,而电脑乙要到100ms时才会画出图象A。显然,用电脑甲的人会比用电脑乙的早90ms先看到图象A。如果看到A时就要开火,用电脑甲的会不会比用电脑乙的有优势?答案是不会,因为server是知道两台电脑的ex_interp的。这里server会存储相当长度的一段历史,当收到来自电脑甲和乙的命令后,通过下面的公式,也就是根据相应的ex_interp来往前查找历史记录(比如目标的移动路线),以此判断是否击中或者谁先击中(想了解详细的可以看原文)。

Command Execution Time = Current Server Time - ping - ex_interp

(5)为什么CPL强调ex_interp 0.01而不是0.1?

  尽管在电脑上看来ex_interp 0.1的图象会比0.01的平滑流畅,但是我们通过上面的公式知道,server必须要倒推一段时间的历史记录来对开火等客户端命令进行判断。这段倒推的时间越长,不可预知的数据误差就会越大。因此ex_interp 0.1相对0.01来说,特别是在射击击中上,随机性要大一些,更加random。换句话说用ex_interp 0.1的,有时候虽然没有瞄得很准但一样爆了头,有的时候瞄得很准却打不死人。当然这些许的随机性对于一般人,对于在几十ping的internet上打CS的或者枪法稍差一点的人来说是感觉不出来的,但是对于顶级高手可能就不同了。强调指哪儿打哪儿,强调每台比赛机器尽量和server同步,也许这就是CPL规定ex_interp 0.01的原因。

(这也是LAN里练出来的步枪一般来说比高ping的internet上练出来的要硬的原因,因为internet上的瞄准是“模糊的”)

【补充】这里实际上存在一个疑点。从上面的解释看,采用ex_interp 0.1时,A-B之间的插值计算除了用到A这一个过去数据点,还用到了B到K的10的未来数据点。因此,也许,在计算A-B之间的图象时用到了过多的“未来”的数据,在图象上可能会出现一些不应该出现的反映“将来”的信息。由于不知道这里的插值函数的具体形式,这个问题存在与否现在无法确定。说不定这才是CPL不让用ex_interp 0.1的真正原因...


(6)如果不是在LAN,updaterate<100会如何?

  由于大部分人都是在internet上打CS的,server一般的sv_maxupdaterate都是30(没有专门调过的server的fps不会大于100,sv_maxupdaterate达不到100),也就是server每秒只向各位的电脑发出30个数据包,每33ms一个数据包。如果此时还是设置ex_interp为0.01会如何?大家应该会有经验,这时候会看到屏幕上人物的移动一闪一闪的不连续。原因很简单,由于数据采样时间只有10ms,而数据包间隔却有33ms,电脑将无法采用哪怕最基本的两点线性插值。电脑只能用另一个方法,根据当前人物的位置和速度来预估计算这33ms中人物的移动(其实当网络传输过程中丢包过多时,电脑也会用同样的处理办法)。自然,这肯定会跟实际情况有很大出入。当server新一轮的数据包传到后,server会强制你的电脑对人物的位置进行修正,这时候就出现了人物动作发闪不连续的现象。

  在internet上打CS的时候,你一般是不会知道server的sv_maxupdaterate的(其实就算知道也不见得有用,因为server输出的数据包不见得就能达到sv_maxupdaterate)。简单的解决方法就是干脆设cl_updaterate为100,也就是说有来多少数据我就收多少,然后从0.01开始慢慢增加ex_interp的值,直到电脑屏幕上的图象平滑连续为止。

zats 发表于 2005-10-25 20:12:16

回复: 【推荐】ex_interp参数解析(Jordan@newsmth)

够详细
。。。。。。。。。。

金闪闪 发表于 2005-10-25 20:30:34

回复: 【推荐】ex_interp参数解析(Jordan@newsmth)

有道理, 学习下。:D

不过我不清楚地是:
电脑甲收到图像A后,马上显示
而电脑乙要等到A~K才显示。

可以说,同样的100ms内,甲显示了A,B,C,D,E,F,G,H,I,J,K个图像。
而乙才一个A,后面的都是插值。

那到底适时显示的图像准确,还是插值得准确。:sweat:

孤独流浪 发表于 2005-10-25 23:30:34

回复: 【推荐】ex_interp参数解析(Jordan@newsmth)

够详细,我一直 是用0.1的,用0.01的时候有很多服务器 进去之后画面不是很连贯。。。难怪我水平那么菜了。

wzj16 发表于 2005-10-26 10:13:25

回复: 【推荐】ex_interp参数解析(Jordan@newsmth)

我很是喜欢此类帖子,长见识不少。因为CS,但是也学了不少东西。谢谢无私奉献的朋友~~~
页: [1]
查看完整版本: 【推荐】ex_interp参数解析(Jordan@newsmth)