更新时间:2022-07-31 09:04:24作者:佚名
回放系统,是电子游戏中常见的一项功能。通过回放,我们可以观摩大神之间的较量,重复享受游戏中的精彩顿时,甚至还可以领到敌军玩家的赛事录象进行剖析和学习。总的来说,回放功能常用于记录整个赛事的过程细节或则展示游戏中的精彩顿时,十分贴合竞技类游戏玩家的需求。
从实现技术角度来讲,下边的这种功能本质上都属于回放的一部份:
彩虹6号中的击杀回放
守望先锋中的完整赛事回放
虽然早在20世纪90年代,回放系统就早已诞生并广泛用于即时战略、第一人称射箭以及体育竞技等类型的游戏当中。
回放系统的录制方法
当我们打开CSGo或则Dota回放文件夹的时侯会发觉这种回放的文件并不大,一场赛事出来最多也就几十兆,远大于对应时长的视频,这么回放究竟是怎样实现的呢?
Dota录制文件大小,打开后通常是乱码
一般来说有三种形式,我们会逐一的展开来讲:
逐帧的录制游戏画面逐帧录制玩家的输入操作定时录制玩家以及游戏场景对象的状态
第一种,逐帧的录制游戏画面。如同现实中体育比赛用摄像机捕捉现场画面那样,我们可以游戏渲染的时侯直接从底层抓取画面信息来持续的生成一个视频流文件,之后通过任意的一个视频播放器都进行解析和回放。
优点:
缺点:
通常来说,因为储存空间以及各类性能问题,录制游戏画面方法几乎不会被用于游戏开发中。
实况篮球联赛回放(可以任意调整视角)
第二种,逐帧录制玩家的输入操作。虽然游戏本身就是一个可视化的软件程序(或则说是一个渲染器),每一时刻的画面都是通过玩家的操作逻辑来驱动的。在考虑游戏内进行回放的情况下(例如死亡回放),我们完全没有必要去录制冗余的画面信息,只须要记录玩家的输入信息之后去驱动游戏逻辑改变画面就可以了。
录制帧输入,回放时根据时间触发那些指令信息即可
优点:
缺点:
一般来说,这些实现方法可以完美的借助游戏逻辑去进行回放,并且消耗十分小。对于帧同步()的网路游戏,不须要额外做太多的工作,适宜性能要求严格、物理估算不太须要同步的RTS、MOBA、FTG等类型游戏。
有了玩家输入信息我们可以较好的往前推动游戏流程,并且却很难执行倒退、向前跳跃等操作。举个场景,如果玩家A在第10帧点击功击按键击杀了一个AI并回复了5点生命值,第20帧点击装备制做按键制做了一把新的装备并且同时因为被敌军击杀而掉落。
假如回放时想从第50帧跳回到第5帧的画面,这么就须要把玩家A复活,新创建的装备删除,扣掉恢复的生命并复活AI。根据上述的第二种方案我们在只记录玩家的输入信息【5帧:功击按键20帧:制做按键】的情况下,几乎不可能顺利还原所有逻辑。根本的缘由是,游戏很容易按照当前的场景和玩家输入推断出下一帧的结果,却很难按照当前一帧的结果和玩家输入推断出上一帧的游戏状态。
除此之外,我们须要保证任何一个操作都必须有一个回滚的逻辑而且不同播放端回滚后的结果是严格一致的的,那些都都远远减小了跳跃播放的难度。
为此,我们可以考虑第三种方案魔兽录像播放器,定时记录玩家以及游戏世界的状态信息(或则说游戏快照)。所谓的状态信息就是某一时刻的对象头上附送的状态信息,例如玩家的生命值、移动位置等。假如我有了每一帧玩家的座标信息,我就可以完美的处理播放、快进、跳跃等逻辑,但很显著这样要记录的数据要多好多。
Dota中的回放,录制状态信息
优点:
缺点:
总的来说,回放的本质是记录游戏的过程信息,画面是最终的表现疗效。为了更好的借助游戏程序本身提供渲染功能和逻辑估算功能,同时从性能、数据量、自由度等多角度考虑,我们一般会按照游戏的类型来选择第二种或则第三种方案来实现游戏内部的回放系统。
回放系统与网路同步
通过前面的描述,我们很容易发觉,回放系统的实现逻辑与网路同步十分相像。从原理上来讲,我们完全可以觉得网路同步是实现回放系统的技术基础,里面第二种方案对应的就是网路同步中的“帧同步()”技术,第三种方案对应就是网路同步中的“状态同步”技术。
其实你们常把网路同步可以简单分为帧同步和状态同步,但实际上这两个概念是国外开发者不断摸索和自创的名词,并非严格指某种固定的算法,她们有好多变种,甚至可以结合到一起去使用。
在现在的游戏中,状态同步是比较流行的实现方法,也可以比较好支持回放的各类功能(例如吃鸡、守望、彩六等)。而且假如频繁的录制整个世界的快照会造成消耗十分大,所以一般会采用定时录制快照+持续录制Delta的形式进行处理,简单来说就是每隔一段时间录制一个存档点(称为),每位存档点之间持续的录制Delta数据(变化的状态信息),每次加载回放的时侯都先找到合适的存档点,之后再通过读取中间的Delta数据快进过去。
+Delta方案示意图
的回放系统就是根据前面的形式实现的,可以比较好的支持快进、跳转、暂停等大部份回放功能魔兽录像播放器,我会在下一篇文章中详尽的剖析虚幻引擎回放系统的实现原理,尽请期盼!
UE中的回放录制命令