帧同步的一些思考(三):技能动作表现

问题

帧同步中的逻辑层使用的简单包围盒做碰撞。渲染层要表现出”拳拳到肉”的效果。

比较直接的方法是 逻辑层有一套完备的定点物理引擎

这里讨论的是,是否能在现有技术上,达成”拳拳到肉”的效果。

逻辑层与渲染层的关系

先理清逻辑层与渲染层的关系,有助于本文后面要讲的实现方法。

  • 服务端与客户端的关系
    传统端游,1 份游戏服逻辑 + N 份客户端逻辑。N 份客户端逻辑根据 游戏服逻辑 的计算结果,进行不断渲染。它们的数据同步,通过网络广播的方式。

    再看,帧同步的逻辑层与渲染层

    N 份逻辑层 + N 份渲染层。每份渲染层根据自己对应的逻辑层计算结果,进行不断渲染。它们的数据同步,通过N份逻辑层自身计算的一致性达成。

    从这个角度来看:

    • 逻辑层代码要具备计算过程强一致性
    • 渲染层代码相对宽松不少,只要最终结果一致性

    即从这个角度来看帧同步,每端的画面表现允许有微小的差别。

    这样的好处有以下几点:

    • 传统网游的客户端优化手段经验,均能用于逻辑层与渲染层
    • 允许每端画面表现有微小的差别,可以让游戏更流畅,抗网络波动性更好些
  • 关键帧与补间帧的关系
    上述关系更进一步,逻辑层与渲染层就可以看成是关键帧与补间帧的关系。

    显然每端的关键帧必须要强一致性。

    至于补间帧,可以牺牲一定的一致性,达成诸如:更加流畅、技能动作表现更好等效果。

如果赞同上述观点,那么我们试着分析下,渲染层要表现出”拳拳到肉” 需要做哪般。

图解渲染层与逻辑层工作机制

这里写图片描述

上图图解了一种渲染层做动画补间的方法。

来分析下:

  • 逻辑层,第 N 帧,计算得出红方块被砍到;并使红方块位移变化到 (X, Y )
  • 逻辑层把这2个状态事件压入队列
  • 渲染层,在第 M 帧 (即逻辑层第 N 帧)从队列中取出 “红方块被砍到” 事件,一直验算,直到砍到。
    可能渲染层1帧内砍到、也可能2帧砍到,都没关系。
  • 渲染层,在第 M + 1 帧 或 第 M + 2 帧 (上个事件处理完毕的那帧),从队列中取出 “红方块被击飞到X,Y” 事件。速度做插值,开始平滑被击飞至 X, Y

本例子采用1种原网游客户端动作优化方案,应用于 帧同步中逻辑层与渲染层 中的例子。

总结

  1. 帧同步中是可以应用 传统网游的客户端优化手段经验 的
  2. 帧同步中在“定点物理库”不是很完备的情况下,可以通过牺牲一定的每端画面一致性来提高技能动画表现效果。

以上

猜你喜欢

转载自blog.csdn.net/u013272009/article/details/80937606