标题:网游预测插值 出处:BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog 时间:Sat, 20 Sep 2008 21:57:09 +0000 作者:ArthurXF 地址:http://www.bizeway.net/read.php/363.htm 内容: 做过一个3D网游项目的插值预测是我负责的.和大家分享一下经验. 具体的项目我不方便透露,但是,其要求实时性是比较高的. 插值和预测是两样的东西. 插值是对已有的几个点做BEIZER曲线插值或者球形插值.以达到平滑的目的. 而预测是在已有的几个点的位置情况下,预测出下个点的位置. 具体的过程是先预测,再插值.由于预测本身不是最准,所以,当服务器下次发来准确的位置时得修正位置. 先说下预测。我们可以利用到的资源是,前几次服务器发来的位置信息。每个点位置的速度和加速度。 假设,上一次收到的信息是 Pos0,Vel0,Acc0 分别表示位置,速度和加速度,那么下一次的的位置可能是Pos0+(vel0+acc0)*deltatime其中deltatime表示UPDATE间隔。但是你直接使用的话,结果是很惨的,人物会在预测位置和修正位置间来回的“跳跃”,因为这样的预测并不是想象中的那么准确。因为下一次服务器来的信息这段时间间隔内,速度和加速度都在改变,这是由玩家控制的,完全离散的信息。 但是我们可以根据速度和加速度的历史来得知速度是加快了还是变慢了。(加速度一般是个固定数) 速度的方向是大致上是哪个方位。这样,我们可以对速度进行第2层的预测。预测方法和以上类似。 如果判断出,速度是正在下降的。那么可以判断下一次的速度是vel-acc逐步下降。如果是上升的那么可 以判断是vel+acc速度逐渐上升。根据这个情况可以初步得到一个预测速度 Vel1 现在总可以加到Pos0上去了吧?且慢!等你以插值的方式移动到那个点的时候,服务器会无情的发给你真正的当前位置,如果你直接过去,也会发生“跳跃”。考虑到这点,Vel1必须缩小。 我的做法是缩小0.8,还有0.2让服务器的位置来的时候看上去不至于太“跳跃”直接修正。然后,我们把这个Scale过的Vel1向量放到World里进行COLLISION,来防止角色“穿墙”,最后得到Vel2. 下一个预测位置就是Pos1=Pos0+Vel2.你将Pos1放到插值队列里,进行中间的插值然后每次Update时候移动过去,就行了~~ Generated by Bo-blog 2.0.3 sp1