- 听众
- 收听
- 积分
- 4810
- 主题
- 回帖
- 0
- 精华
注册时间2007-3-1
最后登录1970-1-1
该用户从未签到
|
这个东西已经让无数人头痛,大家也许看了很多文章,都似乎没有一个固定的说法,而valve也没有给出CS1.6的ex_interp的运行原理.只在CS:Source的网络原理中看出一些内容(http://www.valve-erc.com/srcsdk/general/mu...networking.html)
在本人的这篇文章中,将尝试从参数的运行原理的角度来进行分析,希望各位能够仔细阅读,并多多指正,旨在为弄清原理,做出合理的解释.
一.公式:
QUOTE | ex_interp=1/cl_updaterate |
希望大家牢记这个公式.
记住,先将ex_interp清0,这个公式才能成立
也就是,ex_interp=0之后,它才会随着cl_updaterate的变化而变化
当ex_interp>1/cl_updaterate的时候,ex_interp不随cl_updaeterate变化而变化.
二.参数
cl_updaterate:服务端向客户端发出的更新频率,从0-100可调,表示单位时间内,服务器向客户端告知现时服务器中所有人的情况.
ex_interp:插入帧时间长度,从0-0.1可调,表示客户端虚拟运算插入帧的时间.下面在运行原理部分会详细解释.
三.运行原理:
我们假设一个环境,这个环境是理想情况:
QUOTE | (1)所有人在服务器中没有网络延时,即ping=0
(2)服务器超强,设置非常理想,绝对满足所有人游戏要求
(3)有两个人A和B在服务器中,且两个人机器配置一样,操作系统和CS版本都相同.config只有cl_updaterate和ex_interp不同.
A:
cl_updaterate=100
ex_interp=0.01
B:
cl_updaterate=100
ex_interp=0.1 |
现在,我们进入A的视角,看B的移动.
假设,现在B从时间点为(t00)时刻在(d00)开始移动,他在1s(秒)匀速直线通过了一段距离.现在我们将时间轴和距离都分成100份.
时间: t00-t01-t02-t03-t04-t05-t06-t07-t08-t09-t10-t11-t12-t13-t14-t15-t16-t17-t18-t19-t20-t21...
位移: d00-d01-d02-d03-d04-d05-d06-d07-d08-d09-d10-d11-d12-d13-d14-d15-d16-d17-d18-d19-d20-d21...
t表示时间点,d表示位移点.单位时刻为0.01s(秒)
我们来看看每一个时刻发生什么事.
t00
服务器给A发出通知,B开始从以Xm/s的速度从d00开始向前移动
t00-t01
这段时间是A的主机模拟的时间,也就是interp(插入帧)时间.由于A的设置是ex_interp=0.01,决定了interp插入时间长度为0.01秒.在这段时间中,A的主机所看到的画面,是A自己运算得出的,他根据t00时刻服务器告知的信息来推算这段时间内发生的事情.这个推算是不是对的呢?需要服务器确认.于是...
t01
A的cl_updaterate是100,每0.01秒更新一次,因此,在t01时刻,服务器再次给A发出通知,B现在的状态如何,他现在在移动,位置在d01.这个时候,A的机器就开始对比自己刚才那段推算时间的结果和服务器告诉自己的结果.当然,是以服务器的为准.于是他马上把服务器告知的状态变更为目前时刻B的状态,然后在自己的主机上显示出来.
t01-t02
又是A的模拟运算时间...
t02
A又获得了一次更新
与此类推
现在我们进入B的视角
同样,现在现在A从时间点为(t00)时刻在(d00)开始移动,他在1s(秒)匀速直线通过了一段距离.现在我们将时间轴和距离都分成100份.
时间: t00-t01-t02-t03-t04-t05-t06-t07-t08-t09-t10-t11-t12-t13-t14-t15-t16-t17-t18-t19-t20-t21...
位移: d00-d01-d02-d03-d04-d05-d06-d07-d08-d09-d10-d11-d12-d13-d14-d15-d16-d17-d18-d19-d20-d21...
t表示时间点,d表示位移点.单位时刻为0.01s(秒)
我们来看看每一个时刻发生什么事.
t00
服务器给B发出通知,A开始从以Xm/s的速度从d00开始向前移动.
t00-t01-t02-t03-t04-t05-t06-t07-t08-t09-t10
由于B设置了ex_interp=0.1,所以interp插入时间长度为0.1秒.于是...
这段时间之内,都是B自己运算得出的画面,他是根据在t00时刻服务器告知的信息来推算这段时间之内发生的事情.然后
t10
服务器再次给B发出通知,A现在的状态如何,他现在在移动,位置在d10.这个时候,B的机器就开始对比自己刚才那段推算时间的结果和服务器告诉自己的结果.于是B马上把服务器告知的状态变更为目前时刻A的状态,然后在自己的主机上显示出来.
t10-t11-t12-t13-t14-t15-t16-t17-t18-t19-t20依此类推....
运行原理结论:
我们打CS所看到的画面,是我们自己机器处理数据的结果.其结果是由自己机器的推算,加上服务器的更新通知组成.
推算:靠的是处理时间,也就是interp时间,按照上一次所收到的更新告知的状态,这段时间依靠更新数据包的内容,自己的机器来模拟运行服务端的状态.ex_interp决定了推算时间,或者说插入帧时间间隔.
更新通知:光是依靠客户主机来模拟是不准确的,因为对战是建立在服务器上,结果由服务器来判定,于是,服务器要发出更新通知来告诉客户端正确的信息.cl_updaterate决定了更新的频率,数值越大,更新越频繁.
四.问题产生了
1.为什么我用ex_interp=0.01的时候就会卡,人物好像有重影呢?
答:如果您仔细看了上面所描述的原理的话,你就会明白.每一个更新时刻,都是客户端修正自己的时刻,服务器所告知的状态未必是客户端所模拟的状态.因此当客户端修正的时候,就会有一个短暂的画面变化的瞬间.请注意的是,上面的原理描述部分没有考虑网络延迟的因素,如果加上这一点的话,那么就很好理解了,比如,客户端所模拟的人物已经向前走了距离为2.00米,而服务器因为网络延迟的原因,发送过来的数据包只告诉你,人物向前走动了距离为1.99米,那么修正的图像就会在2.00米突然转为1.99米.然而这种情况相当频繁,所以就会不断有重影的效果出现.网络状况越差,定义的推算时间越短,那么重影现象就越厉害.
2.为什么ex_interp=0.1画面会流畅呢?
答:和上面的提问类似.ex_interp决定了推算时间长度,ex_interp数值越高,在客户端上运算的时间越长,对画面修正的频率越小,画面也因为你的机器所模拟出来的结果而流畅.
3.在相同的环境下,ex_interp取0.1/0.01哪个值会比较有利?
答:这个问题可能更多的会被人认说成,谁先看到谁的问题.我们先看看一个参数cl_cmdrate的解释.
cl_cmdrate指的是客户端向服务器传送的数据包.他决定了你报告给服务器此时你的情况.如果设定太低,服务器不会及时接受你的状态,只有服务器它收到你的报告数据包才能更新你在服务器的状态.因此,我要强调的是,你在别人的视角中出现和你的ex_interp无关,而和你的cl_cmdrate有关.
好,如果理想环境下:
QUOTE | A的设置:
cl_cmdrate 100
ex_interp 0.01
cl_updaterate 100
B的设置:
cl_cmdrate 100
ex_interp 0.1
cl_updaterate 100 |
A每0.01秒向服务器报告状态,在0.01秒的间隔之中他要自己运算一次整个游戏环境,同时每0.01秒收到服务器告诉A所有人的状态,
B每0.01秒向服务器报告状态,在0.1秒的间隔之中,他要自己运算一次整个游戏环境,由于间隔时间长,他每0.1秒收到服务器告知他的更新.
我们不难发现,每0.01秒A和B都会给服务器发送报告,在A看来,B的位置是每0.01秒更新的,不仅因为A自己的updaterate是100,也因为B的cmdrate是100.在B看来,A的位置是每0.1秒更新的,因为自己的updaterate受ex_interp 0.1的影响,更新没有那么及时.那ex_interp=0.1不是很吃亏,都不知道0.1秒之间A的状况了?我认为,在情况都良好的状态下,服务器和客户端是同步运算的,你的机器模拟出的结果和对方报告给服务器的结果都是非常近似的(除非你的机器很破烂,网卡也不好).而cl_updaterate在这种情况下的更新对画面的修正其实效果并没有多明显.也就是说,无论是0.1还是0.01都没有太大的差别.因此我认为,ex_interp取哪个值都不占什么便宜.只是对于规则的一致性的问题.
4.既然你说0.1/0.01都没什么太大分别,那这个参数有什么作用呢?
答:ex_interp设定为0.01是极限值,也是在客户端参数最大化(updaterate 100等等),以及在局域网对战中设置的最优化设置.大型比赛采取这种优化设置保证的是选手的统一性和公平性.对于普通在互联网上对战的用户,在网络延迟情况严重的情况下,就不得不采取修改updaterate来减少服务器对你机器的更新频率,同时由于公式的存在,这使得利用自身机器资源来模拟运算的ex_interp时间长度延长,达到画面流畅的作用.让广泛在互联网对战的玩家能享受到流畅的画面.
五.结语
我曾经发信问了valve关于cs1.6网络参数的事情,始终没有任何回复,有的也是其他人给我发的让我去看souce networking,目前看来想得到官方答复是不太可能的事情.不过这个参数其实一点也不神秘,也不难理解.只是个在网络条件比较差的状况下让画面更加感觉流畅的参数而已.为了比赛或者为了公平,设定为0.01,我想比赛规则是如此,就遵从吧.不过这个东西不能让人说为作弊或者利用了漏洞什么的.就算是有所差异,也是在那一瞬间的画面更替而已,现在的机器运算能力和局域网条件已经完全可以忽略这一点差异......
另外,强烈BS在1.6服务器中使用WWCL而锁定ex_interp为0.1的懒惰的服务器架设者...... |
|