关于 “帧同步” 说法的历史由来

关于游戏同步的话题说的太多了,我是不想再谈了,但是碰到一些含糊和容易引起混淆的地方,必须澄清一下,云风在 2018 年在《lockstep 网络游戏同步方案》中有一段:

首先,我认为把 lockstep 翻译成帧同步,还有与之对应的所谓“状态同步” (我在多次面试中听过这个名词),都是对同步算法的错误理解造成的。把自己所理解的算法牵强附会到已有的在欧美游戏先行者中经过实践的方案上。

最近网易雷火工作室的一篇文章《细谈网络同步在游戏历史中的发展变化》谈到了类似的观点,那么为了避免产生混乱,有必要对 “帧同步”这个说法做一次澄清。

帧同步不是单指某个具体算法,而是范指 “保证每帧(逻辑帧)输入一致” 的一系列算法,传统实现有帧锁定,乐观帧锁定,lockstep,bucket 同步等等,但凡满足“每帧输入一致”的方法皆可以归纳为帧同步类别,至于要不要回滚?服务端要不要跑一套完整逻辑?操作要不要是键盘鼠标?还是高阶命令?客户端要不要像视频播放器一样保证平滑缓存 1-2 帧?或者要不要保证平滑加一层显示对象的坐标插值?这些都是具体优化手段。

我在 2009 年公司应届生培训的《服务端开发培训》课程内,最早开始做同步技术培训:

这个 “帧间同步”喊着喊着就被喊成了“帧同步”,这应届生培训持续了好几年,应该数百人听过这个课程,后面的讲师又接着迭代这个 ppt 接着讲了好几年,听过的应届生们自己摸索后,又写了新的技术分享放到网上,兴许从那时候 “帧同步”和 “状态同步”的说法就流传开了吧。

(点击 Read more 展开)

所以把帧同步理解成 lockstep 的翻译是一个误会,基础的帧同步并不难,是个稍微做过点游戏的程序员那张纸那支笔也能推导出类似的东西来,国内早年一些街机对战平台就开始用类似的方法了,我后来和他们的开发交流过,当时没人听过 lockstep,却也做出了原理类似但是实现又不同的东西,一些项目甚至没看过 time warp 的论文,自己也摸索出了状态回滚的方法。

那么其对立面“状态同步”并不特指某个具体实现,一样可以囊括一系列算法,强调的是:“客户端外在表现不同,但内部状态能统一协调”,抽象一下,它的出发点有两条:

(A) 让所有的用户屏幕上面表现出完全不同的表象是完全没有问题的。
(B) 把这些完全不同表象完全融合在一个统一的逻辑中也是完全没有问题的。

因此和帧同步一样,状态同步并不是对国外某个具体算法的翻译,它也并非特指服务端运行完整逻辑和坐标计算,也不是具体的坐标插值和补偿。这两个名词都是国内不同团队互相交流碰撞提炼出来的,你非要去搜索英文原文自然没有对应单词。

那么为什么要强调帧同步的对立面“状态同步”呢?因为 2008 年国国内同步技术的第一系列概念混乱,2009 年以前,并没有帧同步和状态同步这样区别性的称呼,很多人对这两个问题没什么概念,策划们天马行空出个策划案,程序员也不知道可能出现的陷阱,碰到问题了,网上瞎搜一通,选了条错的路径,一路走下去挂掉。当时网上出现的不少同步技术分析的文章经常将他们混为一谈,比如身边一个篮球项目,明明适合用帧同步的乐观帧锁定来解决的,却因为乱读了一些文章,转去研究导航推测,坐标插值去了,项目上线后加点新动作 bug 一堆,继续死磕了两年后挂掉;还有开发多人射击游戏的,明明应该用状态同步,却去追求什么帧同步的方法,十多人在一起帧同步卡的一塌糊涂。

很多团队开始时根本分不清他们的游戏需要的是帧同步这样的强同步方法,还是状态同步这样的弱同步方法(或者说偏松散的同步方法),因此诸多失败后,需要对不同类型的同步方法做一次广义上的区分,因此有了 “帧同步” 和 “状态同步” 这样的说法,来描述两大类侧重点不同的同步算法,来区分不同的游戏类型的特点,来给现有算法做一次归类。

当然,帧同步和状态同步,是两个大类,具体到你具体的游戏,你会需要抉择更具体的实现。

术语本来就是用来交流和传递概念的,有了这两个叫法,有了各自适配的游戏类型,至少团队之间交流起来,容易清晰多了。因此希望这篇文章能够讲清楚这两个名词的来源和定义,也提倡大家在交流术语上能够取得更广泛的共识,这样起码沟通起来,不会累。

也许帧同步和状态同步喊起来相对形象直观吧,经过十多年的时间,这两个说法在国内还是起得了相对广泛的认可。至少现在一个小白开始搜索游戏同步解决方案时,他能搜索得到存在这两个大类别,各自有哪些特点和限制?适用哪些游戏类型?各自有哪些具体的实现方法和优化。

至于当年培训过的人,或者认同这个说法的程序员们去到云风的公司,被云风认为说法不对,帧同步应该叫做 “广义锁步递进算法”,那我也只能表示很遗憾,你知道是什么意思跟着他说就是了,毕竟他是你的老板。

用网友问能不能分享 PPT,鉴于这么多年过去了,老东家应该早就没用这个了吧,应该不妨碍给大家分享一下,侵删:

《服务端十二小时入门》

链接: https://pan.baidu.com/s/1oBvmdQgsUWKrmU8g9o3u5Q
提取码: 2j9b

Loading

About skywind

Putty 本无树,MinGW 亦非台
This entry was posted in 游戏开发 and tagged . Bookmark the permalink.

One Response to 关于 “帧同步” 说法的历史由来

  1. Pingback: 帧同步游戏中使用 Run-Ahead 隐藏输入延迟 - Skywind Inside

Leave a Reply

Your email address will not be published. Required fields are marked *