1、在死后的尾声阶段,和重生之间,才需要观看阵亡镜头,对吧?这本来就是要开发阵亡镜头系统的真正原因。
2、实际看来,每个缓冲区每分钟需要1M的内存,而每帧记录快照所需的内存量比一分钟1M要多得多。所以我们把快照频率降低为每秒1个。
3、罗马音音标:ryuuga waga teki kurau!ookamiyo、waga teki kurae!(半藏大招台词语音播放)。
4、这两个点之间的距离是由重生定时器控制的,不同的地图、游戏模式、是否加时及所有策划可以配置的情况下,这个定时器的值都不同。
5、就这么多了!(掌声)现在是提问时间,看起来我们还有9分钟。
6、那边厢是儿童劫一个“回首掏”把自己人掏没了,相信脾气再好的队友拳头都要硬了吧。
7、那如何把这些状态转发给客户端呢?我们对每个已连接的客户端也维护了一个“脏集合”(译注:应该指的是C1,C2…作者没有交代这些集合是如何生成的,不过从下文的C1=C1-P可以推测出来)。这一页幻灯片右上方的F是当前帧脏集合。每帧结束时,所有接收者的脏集合会与帧脏集F合并(还是数学上的并集概念),这样数据打包时就可以只包含那些该客户端真正需要的实体集合了。在帧结束时,这些操作都做完以后,帧的脏集会被清空,下次更新(tick)时,一切重头开始。
8、客户端网络状况参差不齐的情况下,这种模型就是最灵活的,不过实现起来也是最复杂的。这就是Overwatch的实现方式。
9、嘿嘿,我没那么厉害啦,其实对面都是机器人(众笑)(译注:视频中Phil拿了个4杀)。
10、所以这里只剩下一个很小的时间窗口,可以让我们把回放数据发下去。大概是半秒钟左右的时间。然而在低带宽条件下,半秒钟是不够传输数据的。
11、在爆头的瞬间,(从视频中可以看出)目标刚好处于准星的位置,完美。
12、对于大多数帧,我们都有足够的带宽来序列化所有数据。即使不够也没关系,这个例子里,只更新了法拉的状态,因为客户端带宽不足,无法容纳大锤的数据了。无论如何,接收者脏集合都会把它保存下来,最终会在将来的某个时刻成功序列化到某个下行包里。
13、半藏:我们一点也不像。(Wearenothingalike.)
14、这些连续的缓冲区在整局游戏运行期间都会存在,因为策划可能需要游戏开始到现在的一卷全场最佳镜头(reel,一段连续的影像,无法直译,下文只好统称为“卷”)。
15、游戏中的设定:半机械人岛田源氏已经dao接受了他曾经排斥的强化躯体,并因此发现了更高境界的人性。
16、半藏:你以为你比得上我?(Thinkyoucandobetterthanme?)
17、在龙的意义上也是如此。近代的中国,因为皇权巩固的关系,龙的形象基本从民间被禁用了,龙神所代表的自然元素——水、河神、江海神的元素都被移除,只留下了皇室代表的这一种含义……请大家回忆一下小时候看过的动画片,中国国产动画片中你举得出几个有龙出现的影片,并且龙是正面形象的?反正我是除了《小龙人》以外想不起其他的来了。相反在日本的神话故事里,龙依然在担任着他们应该担任的形象——龙子太郎、千与千寻中的两条河神龙、神龙斗士、七龙珠、龙狼传、圣斗士中的紫龙——对于熟悉东方project系列的玩家们,我想问你们,你们还记得幻想乡是如何建立起来的嘛?有人会说,是紫妈干的,错!仔细去看看缘起部分,当时的众多大妖们,包括八云紫都是将计划交给幻想乡的龙神,又有龙神授权批准,这才建立了大结界!
18、历史上的确有过很多忍者家族,但他们大多在幕府统治时期就被封或者消灭了,有一些如之前所说的风魔家族的确在天下一统之后就开始作乱变成了盗贼组织,如今的许多日本极道虽然并没有旧时代武士或者忍者的“血统”,但是在家族分配和运营模式是上,的确也和旧时的武士和大名家族类似。
19、意思是:让巨龙吞噬你!白狼出击,无处可藏!
20、差异计算过程比较耗费资源,你可以分摊快照成本或者“增量”(Delta,下文中会多次出现,并直接用英文单词)压缩,这样对于多个客户端来说,只需要处理一次就好了。
21、如果你要问龙文化是不是中国的传统文化?是,当然,但如果你要说龙文化是不是中国“独有”的传统文化,那恐怕我就要对你摇头了。在中国文化中,龙的确有着重要的地位和影响,也正是因为龙的重要和象征意义,所以自古中华民族就在对外输出这种文化。在某个蠢蛋翻译把"dragon"这个形容西方大蜥蜴的单词和我们的龙联系在一起之前,我们早已经把中华民族龙的传说散播到了亚洲各地,甚至通过丝绸之路传到了西方。(马可波罗游记等作品中已经有龙的记载)这一点,我们可以通过翻阅大量东南亚国家的神话传说和人文物件中发现龙的影子。
22、A:星际2是基于帧同步的,它们的回放系统是每次都从头开始,然后快进的方式,同时也实现了回放文件的保存功能。
23、下面就是一个托比昂的炮台拿到全场最佳的例子,炮台杀人无数,咱们可以数一下它杀了几个。
24、你猜对了,新玩家连上后,我们会把它的初始脏状态集合设置为“永久”脏集合L,这里的设置就是字面意义上的赋值。正常的打包流程最终会把所有变化都下发给这个客户端直到它赶上最新的进度。
25、这次分享的标题就预示着必须给出答案,对吧?概要需求是创建一个单一的中央系统,能够支持阵亡镜头、全场最佳和亮眼表现,除此之外我们还特别需要能够生成录像文件,在开发期间可以用来做内部调试。
26、如果你注意到那些天花板上的龙骨,就知道摄像机的位置没办法更好了,实在没办法。
27、快照插值(snapshotinterpolation),FPS经典同步模型,《Quake》最早采用,后续众多FPS在之上做了改进;
28、与快照同步模型相反,服务器不会为全体客户端生成单一更新,而是给每个玩家发送纯手工定制、公平贸易换来的、原生态的数据包(众笑)。
29、顺便说一句,我们想要凑齐12个人其实并不难,无论何时你只需喊一句:跑下版本呗!马上就能满员甚至还有富余(众笑)。不过这事关开发效率问题,不能每次都喊人帮忙。
30、半藏:我们本可以一起创造一个帝国。(Wecouldhavebuiltanempiretogether.)
31、客户端正常接收者是通过网络包进行的,而回放数据需要通过别的途径。我们维护了两个连续的缓冲区,一个是给快照,一个给Delta。每一帧都会记录这两个缓冲区的偏移和尺寸。
32、如果你在开发时不支持回放文件,那就太悲惨了。你应该说服你的工程师,或者如果你自己就是工程师的话,你真的应该先实现这个功能,对于debug来说太有用了。回放文件对于性能分析也很有用。可以提早优化,使得游戏可以运行于任何硬件。
33、这套架构实现阵亡镜头同样很简单。你已经有全量的快照了,对吧?所以只需要维护一个环形缓冲区,保存过去时间点到当前时间之间的世界状态历史,然后重播就行了。注意到我把这里快照(图片)的大小做成不同(译注:指的是上图中ReplayStream线上的4副图)的,你可以图片大近似想象成每一帧的序列化数据尺寸。有一些帧变化的少,所以尺寸就小。
34、关于这对组合在玩家间的信誉,我们从五年前的贴吧老哥口中就可知一二:
35、优化回放文件:快进,倒带,拖放(scrub,随意指定开始位置去播放)。当前的回放文件,只在起始处有一个快照,所以它其实就是一个普通的基于输入的回放机制,你唯一能做的就是从头向后顺序播放。
36、源氏:等着看吧,哥哥。(Weshallsee,brother.)
37、半藏:竜が我が敌を喰らう!/オオカミよ、我が敌を喰らえ!(使用独狼/白狼皮肤)
38、结果就是,因为客户端帧率的粒度较低,你能看见一点点偏离。但是开火反冲却是由该帧脚本精确控制的。
39、这个例子忽略了很多技术细节,而这些细节几乎可以拿出来单独开设分享议题了,包括:脏状态追踪,相关性,优先级,过滤,带宽模型,丢包与确认,以及其他能单独分享的技术。
40、好了,上面讲过的都是干货,现在来点好玩的:挑战和躺坑。如果说之前讲的是“如何做”,那么现在讲的就是“何时”与“何地”,而“为什么”,最开始我就说过了。
41、这其中有太多八卦和阴谋论可以去猜测了,在暴雪没有公布更多资料的如今,我们是无法猜测岛田家族长之死、半藏继位后对源氏发动的杀机以及源氏“意外”身亡(从动画中可以看出是他所用的刀似乎在决斗时候崩口了,原因不明),以及兄弟二人一个被守望先锋所救,一个认识了黑爪,并双双流浪导致家族一蹶不振的背后真相,这个我们不去展开。