クライアント側予測でリアルタイムのランダムな動きを処理する方法


10

クライアントとサーバーで同じ「物理」ループを実行するリアルタイムマルチプレーヤーゲームを構築しています。私は、本質的なランダムな動きであるステアリング動作「ワンダー」を使用しています。ワンダーアルゴリズムを実行すると、クライアントとサーバーは異なる乱数を生成します。

自然にランダムに見える動きをどのように保つことができるのか疑問に思っていますが、クライアントとサーバーが同じ結論になることを保証する定数を使用します。


4
擬似乱数列から同じ乱数列を生成するのは簡単です。難しいのは、そのシーケンスの使用を同期させることです。ランダムシーケンスを使用していないという意味ではなく、ゲームロジックを確定的にする必要がありますが、ランダムシーケンスを確定的に使用する必要があります。これを実現する最も簡単な方法は、通常、ゲームロジックループで同時実行性を回避することですが、PRNGにランダムな値を要求するときにスレッドがPRNGのタイミングとシーケンスに依存しない限り、同時実行性を持つことが可能です。ここでドラゴンになります。
Lie Ryan 14

回答:


14

ランダムシードを使用できます。サーバーとクライアントで同じ32ビット値を選択します(またはサーバーは開始時にクライアントに送信できます)。ランダムジェネレーターのシードとして使用します。ゲームの状態を更新して、サーバーからクライアントに実際のシードを送信できます。送信したくない場合は、クライアントとサーバーがこの乱数ジェネレーターで同じ数の乱数を生成することを確認する必要があります。

実際のシードをクライアントに送信しないことを決定する前に知っておくべきこと:

  • クライアントでのキャラクターのカリングに問題が発生します(クライアントでの戦いの霧の中でキャラクターを処理しないという意味です)。キャラクターのカリングを行う場合、クライアントがキャラクターを処理する必要があるときに、サーバーからクライアントにすべてのキャラクターの状態(実際のシードを含む)を送信するのが最適です。したがって、サーバーは、クライアントが文字を処理するタイミングと処理しないタイミングを決定する必要があります。キャラクターごとに別々のランダムジェネレーターを使用するようにしてください。
  • 同じ問題がAI lodでも起こります。
  • このランダムジェネレーターからの乱数は、固定時間デルタの更新でのみ生成する必要があります。レンダリング前にAI補間にランダムな数字を使用したい場合は、別個のランダムジェネレーターを使用する必要があります(サーバーにはレンダリングがないため、使用するシードは気にしないでください)。
  • クライアントとサーバーに異なるプラットフォーム(C ++とJavaなど)を使用する場合は、クロスプラットフォームのランダムジェネレーターを実装(または検索)する必要があります。ランダムジェネレーターは簡単に実装できるため、これは大きな問題ではありません。

3

サーバーとクライアントの両方がシードに同意する場合、ほとんどのランダム化アルゴリズムは同じ値を出力します。

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