1.2.3 客户端预表现基本流程

在网络游戏中,为了降低延迟对玩家操作手感的影响,客户端预表现是一种常用的技术,大体上可以分为逻辑层预测和表现层预测两大类。

逻辑层预测会预测服务器下行命令的输入数据,直接推动客户端本地逻辑层的状态更新,通常应用于状态同步的网络同步模式。为了修正客户端本地的预测误差,一种常见的策略是预测和回滚相结合。客户端直接预测逻辑层的输入,开始推进游戏状态,在每次接收到服务器下行的逻辑层输入时根据逻辑层状态对预测状态进行确认,若预测误差过大则将游戏状态回滚,执行服务器的逻辑层输入后,重新预表现到当前时刻。这样的策略通常会导致客户端本地的逻辑层数据产生跳变,需要结合表现层插值、帧缓冲等技术来消除跳变的影响;同时还需要保存客户端的中间状态的大量数据,用于回滚,每个逻辑帧都可能需要重新预表现,因而导致消耗大量的CPU算力,在帧同步的模式下难以应用到移动设备上。表现层预测基于逻辑与渲染分离的框架,根据客户端的UI输入,在表现层推动游戏的状态,其特点是不影响客户端逻辑层同步数据,更适合帧同步的模式。

本方案采用的是表现层预测的策略,典型的客户端表现层预表现流程如图1.3所示。

图1.3 客户端表现层预表现流程

玩家的操作输入在上行发送给服务器的同时,同步到预表现模块;预表现模块经计算后,立即在本地执行部分状态表现。另一方面,在经过一段网络延迟后,最初的操作输入经服务器确认下发到客户端,由客户端逻辑模块更新逻辑数据和状态;此时,逻辑模块也需要驱动客户端表现层执行相应的表现。

可见,客户端画面表现同时受预表现模块和逻辑数据更新的驱动,预表现驱动更及时,但可能与逻辑数据更新的结果不一致。逻辑数据驱动更准确真实,但可能已被预表现模块执行完成。如何合理分配预表现驱动的表现状态,并在预表现与逻辑结果发生冲突时将画面表现不明显地修正到真实情况,是预表现技术的重点。