フレーム
イントロ
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