您如何设计频繁变化的游戏的记录/重播系统?


10

我正在使用免费的MMORPG,但遇到了问题。

我(和其他人)正在开发游戏的视频记录系统。这个想法基本上是:我们记录所有带有时间戳的发送和接收的包,以及来自客户端的一些本地数据,然后将其转储到文件中。为了播放视频,我们仅模拟文件中的所有内容。我们还可以选择使用ffmpeg将视频导出到avi。

问题是:当我们在游戏的各个版本之间进行更改时,很难保持视频的向后兼容性(添加/删除命令,功能更改等)。有解决这个问题的好方法吗?而不是拥有一堆不同的播放器,并为每个版本的视频文件选择合适的播放器?

了解其他游戏如何处理这种情况将很有帮助。

感谢您的帮助,对不起我的英语。


就像谷歌搜索/研究的另外一些食物一样:您的方式恰恰是id的Quake Games如何通过捕获服务器包来记录演示的。据我所知,他们根本无法解决兼容性问题。
Michael Stum

我已经更改了此问题的标题-并不是真正意义上的MMO,只是MMO是最频繁更改的游戏。

Answers:


8

我们的基本原则是永远不要更改现有的数据包类型。一切都添加到现有命令的末尾,或者添加新命令。这也使两个人to脚彼此的工作的可能性大大降低。


在此游戏中,它发生了。添加,删除和移动数据包(例如,一段时间前,我们决定将所有与GM-Commands相关的数据包移动到“扩展数据包”中,当我们重写数据包时可能再次发生)。行会系统..编辑命令/功能(更改其功能)的可能性较小,但这不是重点。您说从现在开始,我们不应该删除任何软件包,删除命令只是让它们无法到达服务器端?您的答案!
Marco

1
是的,弃用并留在那里。最终,旧的东西可以被删除,但这通常是在一两年后。
coderanger 2010年

1
另外,一些额外的计划会有所帮助。您现在计划得越好,将来需要进行的更改就越少。
Kylotan 2010年

问题在于游戏总是在变化。我们几乎每个月都会添加一个新数据包(我们添加了新功能)。但是,我们必须对旧的数据包重写功能进行大量更改,等等。但是我想我们可以将这些方法保留在那里,等待一年的时间将其删除。
Marco

3
在这里使用更多通用的数据包类型将对您有很大帮助。您不需要为实现的每个新功能添加新消息。
Kylotan 2010

5

他们只是对游戏代码进行版本控制,并在做出影响重播系统的更改时修改版本,这并不是不可想象的,尤其是在PC上。如果重播文件被标记有其创建时所用的游戏代码的版本,则客户端仍可以访问该版本,以便正常运行。


这就是我在实践中看到的方式,将版本号与游戏日志一起存储。然后,当然,您还必须保留以前的软件版本来重播以前的日志,例如在源代码存储库中,但是无论如何您都应该这样做。
伊恩·施雷伯

感谢您的回答,该游戏是免费的(获得GPL许可),因此任何人都可以访问旧游戏版本,甚至可以编译客户端,因此拥有所有不同版本都不是问题。这是很不习惯,不是所有的备用服务器使用latests版本,还有服务器,从2004年..运行的版本
马尔科·

@Marco:我怀疑SC2的工作原理是将几乎所有代码都放在DLL中。加载重播时,它会检查版本,并加载该版本的DLL,然后运行。它要复杂得多,但是用户只需要安装一次,一个exe就可以运行所有旧的重放。
Mooing Duck

1

解决此问题的一种方法是遵循名为“ Newerth的英雄”的游戏。(每+/- 2周更改一次)据我所知:

  1. 对游戏和重播使用差异补丁。
  2. 所有重播都存储在云中。他们最终会过期。
  3. 如果用户想观看旧的下载重播,则需要先使用“ Compatize”按钮。
  4. 看起来这是远程差异到最新版本;或如果不再存储重播,请上传并进行远程比较。

因为我不在S2工作,所以我显然不能说那绝对是它的工作方式。但是,我注意到与重放时间有关的下载大小趋势明显。

要么,要么将实体补丁添加到重播中(例如,咒语X具有Y效果而不是Z效果)。如果与数据包相关的信息也存储在实体配置中,则该实体热修补将使您也可以了解较旧的数据包。

我绝对不会在客户端存储历史行为,因为这会很快变得巨大。尤其是当客户端从例如10.1.0更新到10.2.0时(因为他们需要下载两个版本之间的每个补丁,而不是最终的补丁)。

Google Protobuf作为序列化层是一个好主意,因为它在设计上支持这种东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.