頻繁に変化するゲームの記録/再生システムをどのように設計しますか?


10

無料のMMORPGで作業していますが、問題があります。

私は(他の人と一緒に)ゲームのビデオ録画システムを開発しています。アイデアは基本的に、タイムスタンプ付きで送受信されたすべてのパッケージと、クライアントからのローカルデータを記録し、それをファイルにダンプします。ビデオを再生するために、ファイルにあるすべてのものをエミュレートします。また、ffmpegを使用してビデオをaviにエクスポートするオプションもあります。

問題は、ゲームのバージョン間で変更を加えると、ビデオの下位互換性(コマンドの追加/削除、機能の変更など)を維持することが困難になることです。この問題を処理する良い方法はありますか?さまざまなプレーヤーを束ねて、ビデオファイルのバージョンごとに適切なプレーヤーを選択する代わりに、

他のゲームがこの状況をどのように処理するかを知っておくと役に立ちます。

助けてくれてありがとう、私の英語は申し訳ありません。


グーグル/研究のためのもう少しの食べ物と同じように:サーバーパッケージをキャプチャして、idのQuake Gamesがデモを記録した方法とまったく同じです。私が知る限り、互換性の問題は決して解決されませんでした。
Michael Stum

この質問のタイトルを変更しました。MMOが最も頻繁に変更されるゲームであることを除いて、それは実際にはMMOに関するものではありません。

回答:


8

基本的なルールは、既存のパケットタイプを変更しないことです。すべてが既存のコマンドの最後に追加されるか、新しいコマンドが追加されます。これにより、2人がお互いの作業に踏み込む可能性もはるかに低くなります。


このゲームでは、パケットが追加、削除、移動されます(たとえば、しばらく前に、すべてのGM-Commands関連パケットを「拡張パケット」に移動することを決定しました。これは、ギルドシステム..コマンド/関数の編集(機能の変更)の可能性は低くなりますが、それは重要ではありません。これからは、パッケージを削除するべきではなく、削除コマンドはサーバー側に到達できないようにするだけですか?ありがとう答えを求めて!
Marco

1
はい、非推奨にして、そのままにしておきます。最終的に古いものは削除できますが、通常は1〜2年後に削除されます。
coderanger

1
また、いくつかの追加の計画が役立ちます。パケットの計画を立てるほど、将来行う必要のある変更は少なくなります。
Kylotan、2010

問題は、ゲームが常に変化していることです。ほぼ毎月新しいパケットを追加しています(新しい機能を追加しています)。それでも、古いパケット書き換え機能などに多くの変更を加える必要があります。しかし、メソッドをそこに残して、それらを削除するために1年待つことができると思います。
マルコ

3
より一般的なパケットタイプを使用すると、ここで非常に役立ちます。実装する新機能ごとに新しいメッセージを追加する必要はありません。
Kylotan、

5

特にPCでは、ゲームシステムのコードをバージョン管理し、リプレイシステムに影響を与える変更を加えたときにバージョンを変更することは想像に難くありません。リプレイファイルに、それが作成されたゲームプレイコードのバージョンがタグ付けされていても、クライアントは引き続き、正常に動作するバージョンにアクセスできます。


これが実際に行われた方法です。バージョン番号をゲームログに保存します。もちろん、以前のログをソースコードリポジトリなどで再生するために、以前のソフトウェアバージョンを維持する必要もありますが、とにかくそうする必要があります。
Ian Schreiber

あなたの答えをありがとう、ゲームは無料(GPLライセンス)なので、誰でも古いゲームバージョンにアクセスでき、クライアントをコンパイルすることもできるので、すべての異なるバージョンを持っていることは問題ではありません。これは非常にすべての代替サーバがlatestsのバージョンを使用しない、使用され、サーバが存在している。.. 2004年から、実行バージョン
マルコ

@Marco:SC2がどのように機能するかは、ほとんどすべてのコードをDLLに入れることだと思います。再生をロードすると、バージョンをチェックし、そのバージョンのDLLをロードして実行します。かなり複雑ですが、ユーザーは1回のインストールだけで済み、1つのexeで古いリプレイをすべて実行できます。
Mooing Duck、2014

1

これに取り組む1つの方法は、「Heroes of Newerth」と呼ばれるゲームの流れに沿ったものです。(これは+/- 2週間ごとに変更されます)私が言えることから:

  1. ゲームとリプレイに差分パッチを使用します。
  2. すべてのリプレイはクラウドに保存されます。それらは最終的に期限切れになります。
  3. ユーザーがダウンロードした古い再生を視聴したい場合は、最初に[Compatize]ボタンを使用する必要があります。
  4. このように見えるのは、いずれかのリモートで最新バージョンと比較した場合です。または、リプレイが保存されなくなった場合は、それをアップロードしてからリモートdiffを実行します。

私はS2で働いていないので、それが間違いなく機能しているとははっきり言えません。ただし、リプレイの経過時間に関連するダウンロードサイズの著しい傾向に気づきました。

または、エンティティパッチをリプレイに追加します(たとえば、スペルXにはZ効果ではなくY効果があります)。パケット関連の情報もエンティティ構成に保存されている場合、このエンティティのホットパッチにより、古いパケットも理解できるようになります。

非常に急速に膨大になる可能性があるため、クライアントに過去の動作を保存することは絶対にありません。特にクライアントが10.1.0から10.2.0に更新する場合(最終パッチではなく、2つのバージョン間のすべてのパッチをダウンロードする必要があるため)。

Google Protobufは、このようなものを仕様でサポートしているため、シリアライゼーションレイヤーとして優れたアイデアです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.