This document is about: QUANTUM 2
SWITCH TO

フレーム

イントロ

Quantumの予測ロールバックアーキテクチャは、レイテンシーを軽減することができます。Quantum は常にロールバックし、フレームをリシミュレートします。これは決定論のために必要なものであり、サーバーによるプレイヤー入力の検証を含みます。 サーバがプレイヤーの入力を確認するか、上書き・置換すると(入力がサーバに間に合わなかった場合のみ)、指定されたフレームの全てのプレイヤーの有効な入力がクライアントに送信されます。有効な入力を受信すると、最後に確認されたフレームは、確認された入力を使用して進みます。

N.B.: プレイヤー自身の入力がサーバーに間に合わなかったり、検証できなかったりした場合は、ロールバックされます。

フレームの種類

Quantumは2つのタイプのフレームの間で異なります。

  • Verified(検証済み)
  • Predicted(予測)

Verified

検証済みフレームは、信頼できるシミュレーションフレームです。検証済みフレームは、すべてのクライアントシミュレーションにおいて、決定論的で同一であることが保証されています。検証済みシミュレーションは、サーバから確認済みの入力を受信した後、次の検証済みフレームのシミュレーションを行います。例えば、サーバーからのRTT/2に比例して前進します。

フレームは、以下の条件が両方ともtrueである場合に検証されます。

  • すべて のプレイヤーからの入力が、このチェックのためにサーバーによって確認されます。
  • 過去のティックはすべて検証されます。

プレイヤーのサブセットのみからの入力がサーバーによって検証されている場合、部分的なティック確認は、検証済みの目盛り/フレームにはなりません。

Predicted

_検証済みフ_レームとは逆に、予測 フレームはサーバからの確認済み入力を必要としません。これは、シミュレーションがローカルセッションに十分なデルタ時間を蓄積するとすぐに、予測されたフレームが予測で進むことを意味します。

Unity-side APIは、予測されたフレームの様々なバージョンへのアクセスを提供しています。以下のAPIの説明を参照してください。

  • Predicted : 同期化されたクロックに基づく¥シミュレーションの 「ヘッド 」。
  • PredictedPrevious (予測 - 1): メインクロックのエイリアシング補間に使用されます (ほとんどのビューでは、Unity のローカルクロックがメインサーバークロックからわずかにドリフトする可能性があるため、スムーズに保つためにこれを使用します。Quantum はサーバークロックと同期した、 スムーズに修正された別のクロックから実行されます)。
  • PreviousUpdatePredicted: これは、前回 Session.Update が呼び出されたときの "Predicted/Head" と同じフレームです(修正されたデータが含まれています)。エラー訂正のインターポリテーションに使われます(ほとんどの場合、エラーは発生しません)。

API

Verified_フレームと_Predicted_フレームの概念は、シミュレーションとビューの両方に存在します。

シミュレーション

シミュレーションでは、Frameクラスを用いてシミュレーション中のフレームの状態にアクセスすることができます。

メソッド 戻り値 説明
IsVerified bool すべてのクライアントでフレームが決定論的であり、サーバで確認された入力を使用している場合に true を返します。
IsPredicted bool フレームが局所的に予測されたものであればtrueを返します。

ビュー

ビューでは、QuantumRunner.Default.Game.Framesによって、_検証済み_と_予測_のフレームが利用可能になります。

メソッド 説明
検証済み 信頼性の高いシミュレーションフレームで、すべてのクライアントで同一のものを使用します。
Predicted 同期されたQuantumクロックに基づくローカルシミュレーションの「ヘッド」。クライアント間で異なる場合があります。
PredictedPrevious Predicted - 1
メインクロックのエイリアシング補間に使用され、ほとんどのビューではこれを使用して滑らかさを維持します。Unityのローカルクロックがメインサーバークロックからわずかにずれている場合があるため、Quantumはサーバークロックと同期している別のクロックから実行されます。
PreviousUpdatePredicted 前回Session.Updateが呼び出された時に「Predicted/Head」フレームであったフレームをリシミュレートしたもの。これは、ロールバックの際に、保持しているデータを「修正」するために必要です。これは、補間におけるエラー訂正のためにビューによって使用されます。年のための手段であり、めったに必要とされることはありません。

Frame.Userの使用

Frameは、Frame.User.csにデータを追加すれば拡張できます。ただしこれによって、対応する初期化、割り当て、フレームが使用するシリアル化メソッドも実装する必要があります。

C#

partial void InitUser() // Initialize the Data

partial void SerializeUser(FrameSerializer serializer) // De/Serialize the Data
partial void CopyFromUser(Frame frame) // Copy to next Frame

partial void AllocUser() // Allocate space
partial void FreeUser() // Free allocated space

: フレームに大量のデータを追加すると、後続の参加だけでなく、パフォーマンス(非/シリアル化)にも影響をおよぼします。

サンプル

以下は手動メモリ割り当てを必要としない、非常に単純なサンプルです。

C#

using System;

namespace Quantum {
    unsafe partial class Frame    {
        public byte[] Grid => _grid;
        private byte[] _grid;

        partial void InitUser() {
            _grid = new byte[RuntimeConfig.GridSize];
        }

        partial void SerializeUser(FrameSerializer serializer)
        {
            serializer.Stream.SerializeArrayLength<Byte>(ref _grid);
            for (int i = 0; i < Grid.Length; i++)
            {
                serializer.Stream.Serialize(ref Grid[i]);
            }
        }

        partial void CopyFromUser(Frame frame)
        {
            Array.Copy(frame._grid, _grid, frame._grid.Length);
        }
    }
}
Back to top