游戏中渲染层实体怎样平滑的做插值

主要基于 Source 引擎的这篇文章 Source Multiplayer Networking 作答。如果和题主查阅的相关资料或者题主对同步逻辑的理解有偏差,希望指正。
简单的线性平滑内插外插在应对大误差的情况表现的貌似并不好,特别是针对有物理引擎刚体实体时这里的“大误差”具体指的是什么?是指变动特别剧烈吗?物理引擎的计算似乎不会带来很大的“误差”。
回滚操作之后,逻辑层刚体的位置线速度角速度变化都很大,这时候如何才能使得渲染层平滑的表现? 【游戏中渲染层实体怎样平滑的做插值】 在客户端不会进行回滚,回滚的操作只是在服务端进行的。客户端进行的操作只是基于服务器发送的帧同步包进行插值模拟。并且,回滚操作本身只是一个临时的操作,主要用来进行关键的操作判定逻辑(e.g. 玩家的此次射击是否击中另一个玩家?),不会对服务端实际的世界状态造成影响。
具体的来说,在帧同步算法下,客户端在每一个渲染帧所做的事:
游戏中渲染层实体怎样平滑的做插值

根据当前时间戳,拿到渲染时间,再根据渲染时间拿到对应插值区间的两个关键帧(关键帧是服务器同步过来的)计算出当前帧根据在这两个关键帧之间的时间位置,进行插值如果渲染时间超出了最后一个关键帧对应的时间,则基于最后的关键帧进行外插值题主所说的回滚发生在服务器端,仅当服务端拿到客户端发送的输入帧,并且要进行对应的逻辑判定时。此时:
服务器通过客户端的时间戳计算出其当时的渲染时间服务器拿到那个渲染时间对应的两个关键帧,备份当前所有实体的位置并进行和客户端同样的插值在服务端插值到同样的时间点后,执行相关判定逻辑相关判定逻辑执行完成后,复原所有实体的位置所以,至少这个意义上的回滚逻辑和客户端没啥关系。如果题主的意思是在客户端和服务器判定逻辑不一致造成的瞬移等情况,这个是进行关键帧同步再插值以后出现的自然现象,也不会有一个明确的逻辑去进行回滚。

■网友
我大概理解你想问什么,插值只能保证两点之间的变化平滑,但你想要的结果是客户端根据服务端传回的结果矫正极大偏差时不产生类似快动作的突兀感,这个靠插值是无能为力的,因为对于“丢失”的这段时间里的内容要么快放要么跳过,还没想到更好的处理办法,否则网络游戏也不用对网络延时有较高的要求了。


    推荐阅读