Newer
Older
PixelPaintWar / apps / client / src / scenes / game / application / time / SyncIntervalPolicy.ts
/**
 * SyncIntervalPolicy
 * RTTに応じて時刻同期間隔を決定する
 * 通信品質に追従する送信間隔ポリシーを提供する
 */

/** 同期間隔判定の設定値 */
export type SyncIntervalPolicyConfig = {
  defaultIntervalMs: number;
  lowLatencyThresholdMs: number;
  mediumLatencyThresholdMs: number;
  lowLatencyIntervalMs: number;
  mediumLatencyIntervalMs: number;
  highLatencyIntervalMs: number;
};

/** 同期間隔判定の既定設定 */
export const DEFAULT_SYNC_INTERVAL_POLICY_CONFIG: SyncIntervalPolicyConfig = {
  defaultIntervalMs: 3000,
  lowLatencyThresholdMs: 80,
  mediumLatencyThresholdMs: 180,
  lowLatencyIntervalMs: 5000,
  mediumLatencyIntervalMs: 3000,
  highLatencyIntervalMs: 2000,
};

/** RTTに応じた同期間隔を判定する */
export class SyncIntervalPolicy {
  private readonly config: SyncIntervalPolicyConfig;

  constructor(config: Partial<SyncIntervalPolicyConfig> = {}) {
    this.config = {
      ...DEFAULT_SYNC_INTERVAL_POLICY_CONFIG,
      ...config,
    };
  }

  /** RTTに応じた推奨同期間隔を返す */
  public getIntervalMs(smoothedRttMs: number | null): number {
    if (smoothedRttMs === null) {
      return this.config.defaultIntervalMs;
    }

    if (smoothedRttMs <= this.config.lowLatencyThresholdMs) {
      return this.config.lowLatencyIntervalMs;
    }

    if (smoothedRttMs <= this.config.mediumLatencyThresholdMs) {
      return this.config.mediumLatencyIntervalMs;
    }

    return this.config.highLatencyIntervalMs;
  }
}