游戏中的回放系统是如何实现的?
本文首发“游戏开发那些事 ”
作者:Jerish
回放系统,是电子游戏中常见的一项功能。通过回放,我们可以观摩高手之间的对决,重复享受游戏中的精彩瞬间,甚至还可以拿到敌方玩家的比赛录像进行分析和学习。总的来说,回放功能常用于记录整个比赛的过程细节或者展示游戏中的精彩瞬间,非常贴合竞技类游戏玩家的需求。
从实现技术角度来讲,下面的这些功能本质上都属于回放的一部分:
精彩瞬间展示: FIFA / 实况足球 / NBA2K / 守望先锋 / 极限竞速:地平线 / 跑跑卡丁车死亡回放: 守望先锋 / 彩虹六号 / 使命召唤 / CODM全局比赛录制、下载、播放: 守望先锋 / CSGO / Dota / LOL / 魔兽争霸 / 星际争霸 / 红色警戒 / 坦克世界 / 绝地求生 / 王者荣耀观战(常用于非实时观战): CSGo / 堡垒之夜 / Dota时光倒流: Braid / 极限竞速:地平线彩虹6号中的击杀回放
守望先锋中的完整比赛回放
其实早在20世纪90年代,回放系统就已经诞生并广泛用于即时战略、第一人称射击以及体育竞技等类型的游戏当中。
回放系统的录制方式
当我们打开CSGo或者Dota回放文件夹的时候会发现这些回放的文件并不大,一场比赛下来最多也就几十兆,远小于对应时长的视频,那么回放到底是如何实现的呢?
Dota录制文件大小,打开后一般是乱码
通常来说有三种方式,我们会逐一的展开来讲:
逐帧的录制游戏画面逐帧录制玩家的输入操作定时录制玩家以及游戏场景对象的状态第一种,逐帧的录制游戏画面。 就像现实中体育赛事用摄像机捕捉现场画面那样,我们可以游戏渲染的时候直接从底层抓取画面信息来持续的生成一个视频流文件,然后通过任意的一个视频播放器都进行解析和回放。
优点:
播放简单,随便找个视频播放器即可方便分享到社交平台完美支持倒放和跳跃进度缺点:
占用大量的存储空间录制性能开销较大加载速度慢,很难实时地用于游戏中不够灵活,视角受限,无法定制特殊功能一般来说,由于存储空间以及各种性能问题,录制游戏画面方式几乎不会被用于游戏开发中。
实况足球比赛回放(可以任意调整视角)
第二种,逐帧录制玩家的输入操作。 其实游戏本身就是一个可视化的软件程序(或者说是一个渲染器),每一时刻的画面都是通过玩家的操作逻辑来驱动的。在考虑游戏内进行回放的情况下(比如死亡回放),我们完全没有必要去录制冗余的画面信息,只需要记录玩家的输入信息然后去驱动游戏逻辑改变画面就可以了。
录制帧输入,回放时按照时间触发这些指令信息即可
优点:
录制数据极小,存储空间友好,网络发送便捷录制性能开销几乎可以忽略对于帧同步的游戏,额外开发工作较少播放视角可以随意调整和定制缺点:
回放消耗性能很大,等价于重新跑游戏进度跳跃比较困难、倒放很困难只能在游戏内播放要严格保证游戏内逻辑计算结果的一致性通常来说,这种实现方式可以完美的利用游戏逻辑去进行回放,而且消耗非常小。对于帧同步(LockStep)的网络游戏,不需要额外做太多的工作,适合性能要求严格、物理计算不太需要同步的RTS、MOBA、FTG等类型游戏。
有了玩家输入信息我们可以较好的向前推进游戏流程,但是却很难执行倒退、向前跳跃等操作。举个场景,假如玩家A在第10帧点击攻击按钮 击杀了一个AI并回复了5点生命值,第20帧点击武器制作按钮 制作了一把新的武器但是同时由于被敌人击杀而掉落。
如果回放时想从第50帧跳回到第5帧的画面,那么就需要把玩家A复活,新创建的武器删掉,扣掉恢复的生命并复活AI。按照上述的第二种方案我们在只记录玩家的输入信息【5帧:攻击按钮 20帧:制作按钮】 的情况下,几乎不可能顺利还原所有逻辑。根本的原因是,游戏很容易根据当前的场景和玩家输入推算出下一帧的结果,却很难根据当前一帧的结果和玩家输入推算出上一帧的游戏状态。
除此之外,我们需要保证任何一个操作都必须有一个回滚的逻辑并且不同播放端回滚后的结果是严格一致的的,这些都都远远增大了跳跃播放的难度。
因此,我们可以考虑第三种方案,定时记录玩家以及游戏世界的状态信息(或者说游戏快照) 。所谓的状态信息就是某一时刻的对象身上附带的状态信息,比如玩家的生命值、移动位置等。如果我有了每一帧玩家的坐标信息,我就可以完美的处理播放、快进、跳跃等逻辑,但很明显这样要记录的数据要多很多。
Dota中的回放,录制状态信息
优点:
录制数据量中等,可以根据具体情况调整和优化录制性能开销较少回放时性能消耗尚可可以支持跳跃、倒放等常见功能不用担心计算一致性问题(浮点数精度、随机数等)播放视角可以随意调整和定制缺点:
实现逻辑相对复杂只能在游戏内播放录制数据量和性能上不如第二种方案总的来说,回放的本质是记录游戏的过程信息,画面是最终的表现效果。为了更好的利用游戏程序本身提供渲染功能和逻辑计算功能,同时从性能、数据量、自由度等多角度考虑,我们通常会根据游戏的类型来选择第二种或者第三种方案来实现游戏内部的回放系统。
回放系统与网络同步
通过上面的描述,我们很容易发现,回放系统的实现逻辑与网络同步非常相似。从原理上来讲,我们完全可以认为网络同步是实现回放系统的技术基础,上面第二种方案对应的就是网络同步中的“帧同步(LockStep)”技术,第三种方案对应就是网络同步中的“状态同步”技术。
虽然大家常把网络同步可以简单分为帧同步和状态同步,但实际上这两个概念是国内开发者不断摸索和自创的名词,并非严格指某种固定的算法,他们有很多变种,甚至可以结合到一起去使用。
在如今的游戏中,状态同步是比较流行的实现方式,也可以比较好支持回放的各种功能(比如吃鸡、守望、彩六等)。但是如果频繁的录制整个世界的快照会导致消耗非常大,所以通常会采用定时录制快照+持续录制Delta的方式进行处理,简单来说就是每隔一段时间录制一个存档点(称为Checkpoint),每个存档点之间持续的录制Delta数据(变化的状态信息),每次加载回放的时候都先找到合适的存档点,然后再通过读取中间的Delta数据快进过去。
Checkpoint+Delta方案示意图
Unreal的回放系统就是按照上面的方式实现的,可以比较好的支持快进、跳转、暂停等大部分回放功能,我会在下一篇文章中详细的分析虚幻引擎回放系统的实现原理,尽请期待!
UE中的回放录制命令
实况足球越来越真实,但让我回味的还是20多年前PS1上面的那一款
作为80后,真正接触到足球基本是在90年末期,随着动漫足球小将的热播和98世界杯的火热,男男女女都开始关注这项运动,可能男生偏向喜欢的是足球运动本身,女生更喜欢的是以贝克汉姆为代表的俊朗青春的足球运动员。总之,就这样踢上了足球。但说实话,看习惯了足球小将,再看真实的电视足球比赛总是会觉得很无聊,一个多小时来来往往可能也进不了一个球,不是很无聊么,所以除非有进球集锦,要不基本上是跳过。就这样踢着玩了一段时间后,我意识到足球其实很有意思。与小伙伴们一起踢球,我们你一脚我一脚地传球、过人,这种互动带来了无尽的乐趣。
要说电子游戏对男孩子的吸引力,那可能是天生的,不管是街机、PC还是FC或者MD游戏,只要能玩就会引起我的驻足。在那个一块钱可以换取四个游戏币的日子里,我可以整天玩着飞机射击、拳皇9798、恐龙名将惩罚者、三国西游等游戏。尽管我从没尝试过足球游戏,但自从对足球有了些许兴趣后,我特意留意了街机厅里的足球游戏,往往只有少数街机厅里面有一台足球游戏的街机会放在角落。感觉上,这些足球游戏和FC上的热血足球差不多,它让我感受到了热血澎湃的氛围,尤其是进球后那些庆祝动作的特写,充满了激情与炫酷。然而,随着时间的推移,我不可避免地开始感觉到这些动作和场景不够真实。在没有遇到更好的足球游戏之前,我还是继续玩了好长一段时间。
时间飞快,到了2001年,中国国家足球队成功进入了亚洲十强赛,这让国人开始对国足杀入世界杯有了一丝希望。在紧张激烈的十强赛期间,我常常兴致勃勃地光顾街机厅,感受着在那里夺冠的足球快感。
就像许多爱情故事一样,某个温暖夏日的午后,和朋友们切磋完街机游戏后,有人提议我们一起去一家新开的游戏店逛逛,当时我想也许又是一家新的街机厅吧,时间还早,顺路看看也没关系。进去一看,眼前是一排电视,上面播放着足球比赛的画面。我忍不住说:“怎么都在看足球比赛啊。”我的小伙伴嘻嘻笑着回答:“怎么是看呢,是在玩啦。”说实话,当时我真的被震撼到了,画面和动作真的足够逼真,远远看去,我甚至以为是真实的比赛。
从那以后,这个地方就成了我未来几年常去的地方,街机厅渐渐被我遗忘。也正是在这个时候,我才知道这个游戏是实况足球,我第一次接触到的是PlayStation上的《胜利十一人2000》。然后就是之后的日子里,和许多玩家一样,我每周的零花钱都贡献给了这个游戏。那个时候,玩一个小时需要3块钱。父母给我一周20块的伙食费,我能从当中省出6块钱来玩这个游戏。可恨的是机房只有两个PS1的记忆卡,好不容易去玩一次总发现自己的记录被别人给覆盖了。
后来经过查阅资料才知道,这款游戏是2000年8月24日,KONAMI推出的《World Soccer Jikkyou Winning Eleven 2000: U-23 Medal heno Chousen(世界足球实况胜利十一人2000 U-23 奖牌的挑战)》,这是一款在《WE4》真实化的基础上结合了系列此前的流畅的节奏和灵活的操作等优点的成熟型作品。
几年前偶然看到了一个纪念短片,庆祝实况足球二十周年。把这个短片转发到微信群,马上勾起了小伙伴们一起玩实况足球的回忆,脑海中曾经的一些模糊的记忆开始慢慢变得清晰起来:那时候我们最常玩的是《胜利十一人2000》(后来我们都称之为实况足球),我至今还保留着一张PlayStation原版游戏,记得游戏里的两位解说中西哲生和长谷川健太,前者在日本足球解说界越来越好,后者后来还成了日本J联赛球队的主教练。每次启动实况足球游戏,仿佛还能听到他们喊出的“舒托”、“阿布赖”、“索隐(Throw in)”、“哦哇塞他”等声音……
实况的火爆使得玩这个游戏的人越来越多,经常是等不到机玩,去得多了跟别人也能混个脸熟。当碰到机子不够的情况,玩双人对战也还能把成本平摊降低一些。开始玩的时候也就仅仅能打赢中等难度的电脑,开始挑战高级难度的时候简直感觉这是无论如何也无法翻过的高墙,后来我学会bug般的“one-two”二过一的方法,以为能学成出山,后来才知道那是各地实况都不允许使用的禁招,哈哈。最后一次和同学一起去踢实况是在十五年前的大学时期,过年老家的时候我们组织了一次高中同学聚会,之后我和几个曾经的高中玩伴一起去了一个地下室机房,玩了几个小时,当时已经是在PS3上玩实况了。
而最开始去的那几家机房早就因为拆迁的原因消失了,到现在基本找不到这样的机房了。一方面,市场需求已经不大,另一方面,随着生活水平的提高,大多数玩家都有了自己的家用主机,就算没有主机的,家里也有电脑,能通过电脑模拟器来运行。
因为实况足球游戏,让我也更加热爱足球,从中学到现在一直喜欢这项运动,大学时加入院系队伍参加各种比赛;也因为实况足球,更理解了足球规则,各种回放对越位、犯规之类的认识更深刻了;也因为实况足球,从一开始我就喜欢两支球队,一直到现在,一支是拜仁慕尼黑,另一支是德国,都是以力量、头球代表的球队,那时候的德国和拜仁,实力不强球星也不多,但总能在大赛里面取得好成绩,不畏强权和拼搏争胜的意志是我喜欢他们的原因,每次玩必先选这两个队。哪能想到15年后的今天,德国足球居然连续两届世界杯无法从小组突围,还被日本队打得连教练都下台了。。。
现在,我依然会偶尔玩一把实况足球。周末的时候,我会和朋友们去体育场踢踢野球,或者在电视看看周末的比赛直播。对足球的热爱有很多种表达方式,而玩实况足球可能是我投入最多情感的一种方式,那不仅仅是情怀,还关乎更多。即使我最钟爱的球队和球星在大赛上已经出局了,我还能在游戏中带领他们获得冠军,填补心中的一点遗憾。偶尔独自打开尘封的PS,放入游戏碟片,听着经典的开机音效,玩上几盘游戏,找找当年的感觉,但总觉得少了一点什么,仔细一想,原来我周围没有曾经的那群小伙伴了。
实况足球:超级周精选?评测来了,这期很强?
入口1:高清免费观看全球体育赛事
入口2:头条搜索【857体育】
大家好,欢迎来到飞驰的足球。
这期周精选看着有点厉害,每个球员加强都很多,还有一个超级小妖。
姆巴佩老样子了,射门加了4点,其他疯狂减,用处不太大,我姆总不缺射门,身体控制减了5点就很难受,我的评价是不如普卡。
这又是哪来的小妖?16岁应该是假的吧?
双速拉满,盘控顶级,作为前腰,射门和脚下力量也是毕业水平,除了模型和传球略微次了点,没有缺点了,总评98,我的评价是顶级前腰。
佩莱格里尼几个版本的精选数据都不错,还是之前一版总评96的数据最好。
大模型加上优秀的传球和不错的速度,前腰最适合,影锋也可以,技能也很全面,我挺看好这张卡的。
射门加了11点,脚下力量98,顶级中锋水平,可惜爆发减了,这张卡在A状态的时候用起来应该挺强的,其他时候,参考奥西姆亨,后者是属于身体素质炸裂的。
这应该是巴西小陀螺的第一张周精选吧?风格挺好的,靠一脚搓射,其他方面就马马虎虎啦。
后面几个球员就不说了,威廉姆斯需要提一下,以前玩妖人套就挺喜欢用,更早之前玩FIFA就感觉他很好用,这张精选大幅度加了射门、进攻和身体接触,加上不错的模型和优秀的双速,完美的边路爆点。
既能够暴趟,又能靠盘带秀对面一脸,好卡好卡。
总结一下,这个包里两个前腰很不错,威廉姆斯也非常不错,姆巴佩在新版本也挺强的,建议有需求的小抽一下。
全球赛事回放请关注:@857体育