今天在玩一款网络游戏的时候,发现一个问题,当用键盘操作主角的时候。
同时按住两个方向键,人物并不是往那两个方向的夹角走直线,而是在围绕一个点做圆周
运动,对于这种运动方式,如果用传统的dead reckoning模型,其方向将不停的在变,则
会带来大量的网络流量,那么如何解决这样的问题呢。低头沉思若干时间,终于恍然大悟。
首先用数学模型来描叙传统的dead reckoning模型:
s(t) = v(0) * t + (a * t ^ 2) / 2
对于这个模型,当a为常数,或者变化频率不高的情况下,我们可以用linear approximation来进行预测。
但对于圆周运动这种每一时刻a都在变化的情况来说,这种模型就不太可取了。
如果看明白了我上面讲的,就可以忽略下面我将要讲的这个例子:
两个盲人一前一后的在沙漠里行走,他们中间有根绳子,绳子上绑了个炸弹,其规则是
当绳子绷紧到一定的程度之后,炸弹就会爆炸。而且呢,前面带路的那个盲人的左脚有
点问题,所以走出的路线实际上是一个向左的弧线。而后面那个盲人则是个正常人。
刚刚开始的时候,他们之间的绳子总是会因为前后两个盲人的速度方向不一致而经常会
出现险情。后来后面那个盲人痛定思痛,不敢拿自己的生命开玩笑,于是就跟着前面的
盲人一样,也逐渐的把自己的方向往左边拐,于是,绳子绷紧的发生的次数就越来越少了。
这个例子可以用来比较三种同步方法,最原始的同步方法,dead reckoning,和改进版
的dead reckoning:
最原始的方法就是前面那个盲人后面拖的是一块大石头,由于跟地面有摩擦力,只有在
绳子绷紧的情况下才会往盲人那边靠近一段距离,所以他们之间的绳子定时的每隔一段
时间就会产生绷紧的情况。
而dead reckoning就是前面那个盲人后面拖的是辆小车,有四个轮子,在走直线的时候,
表现得非常完美,几乎不会产生任何绳子绷紧的情况,只有在拐弯的时候才会发生绷紧
的情况,对此前面那个盲人很满意。
但是对于前面那个盲人脚出现问题的时候,小车也就出问题了,小车会在绳子绷紧的时候
改变到和盲人一样的方向,但是仍然是直线,这个时候当盲人走的是曲线的情况下,小车
就会一左一右的不停的走直线,每次走到绳子绷紧的时候就换到往另一个方向走直线。
而改进版的dead reckoning,更具智能一些,已经从石头升级到小车,升级到另外一个盲
人,俗话说,了解盲人的还只有盲人,i'm blind not deaf,肉眼看不见不要紧,还有心
眼。
恩,那么改进版的数学模型是什么样的呢。
其实很简单,大家都学过的数学知识,就是距离和时间的三阶导数方程。
一阶导数是速度,二阶导数是加速度,三阶导数就是加速度/时间
单位就是s/t^3,暂时给它取个名字叫k。
那么距离在时间t的预测就是:
s(t) = v(0) * t + a(0) / 2 + (k * t ^ 3) / 4
理论上讲,导数的阶数越多,预测得越精确。但是,有必要么?键盘只有两种状态:
按下/松开,不会存在我按下3/4键盘的说法吧,那么如果键盘的按下和松开能改变加
速度A的话,这个量就一定是个定量,所以通过给加速度求导来获取一个方程已经足够
决大多数网络游戏使用。
什么?没价值?这是有实际的应用价值的。网络游戏的瓶颈主要是在于网络,而不是在
于客户端的显示,否则也不会在网络游戏中出天堂II那种夸张得不考虑显示效率的高多
边型模型。那么尽大可能的减少网络传输的情况下,仍然保证比较良好的同步效果就成
了比较重要的问题。在解决这个问题的同时,您获得的将是允许在服务器端实现更复杂
的逻辑或者支持更多的游戏人数。
原创文章,如需转载,请联系作者。