⚡ タイムワープとTick加速エンジン
📌 リポジトリソースコードに関する免責事項: このWikiのドキュメントはリポジトリ内の現在のソースコードの状態を反映しており、CurseForgeおよびModrinthでの公式リリース前の最新コミットや開発中の機能が含まれている場合があります。
🔬 タイムワープエンジンの動作原理
True Sleepの最大の強みは、物理サーバーエンジン速度 (engine_tps) と 見かけ上の仮想時間速度 (virtual_tps) を完全に分離している点にあります。
CPUに毎秒1,000回のリアルゲームティックを実行させようとすると、深刻なサーバーラグや切断が発生します。True Sleepはサーバー物理エンジンを安定した設定値(初期値:$50\text{ TPS}$)で稼働させ、数学的な ストライド倍率 (Stride Multiplier) を用いて世界時間をまとめて進行させます。
📐 数式モデルとストライド比率
1. ストライド比率の算出式
サーバーは1回の物理ティックあたりに進めるべきワールドティック数を計算します: $$\text{Physical Target} = \min(\text{engine_tps}, \text{targetRate})$$ $$\text{Stride} = \max\left(1, \text{round}\left(\frac{\text{targetRate}}{\text{Physical Target}}\right)\right)$$
- 初期設定での計算例:
- $\text{engine_tps} = 50\text{ TPS}$
- $\text{virtual_tps} = 1000\text{ TPS}$
- $\text{Stride} = \frac{1000}{50} = 20\times\text{ ストライド}$
- 結果: サーバーはわずか 2.5倍 のCPU負荷(50 TPS動作)でありながら、物理ティックごとに20ワールドティックを進めることで、$1000\text{ TPS}$(通常の50倍速)の超高速シミュレーションを実現します!
2. 目標時刻接近時の滑らかな減速バッファ
起床目標時刻に近づく($\text{dist} < 200\text{ ticks}$)と、ワープエンジンは滑らかに減速し、急激な停止による違和感を防ぎます:
$$\text{progress} = \max\left(0.0, \min\left(1.0, \frac{\text{dist} - 20}{180}\right)\right)$$ $$\text{targetRate} = 20.0 + (\text{virtual_tps} - 20.0) \times \text{progress}$$
3. 早期起床時の15ティック線形減速シーケンス
プレイヤーが途中で目覚めた場合(ベッドが破壊された、手動で起きた、ダメージを受けた等)、True Sleepは20 TPSへ瞬時に落とすのではなく、15ティックかけた滑らかな線形減速 を行います:
$$\text{progress} = \frac{\text{decelerateTicks}}{15.0}$$ $$\text{currentRate} = 20.0 + (\text{lastWarpRate} - 20.0) \times \text{progress}$$ $$\text{stride} = \max(1, \text{round}(1 + (\text{lastWarpStride} - 1) \times \text{progress}))$$
4. ランダムティック速度 (randomTickSpeed) の動的スケーリング
作物の成長、葉の消失、銅の酸化はバニラの randomTickSpeed ゲームルールに依存します。True Sleepは就寝中にこのルールをストライド比率に応じて動的に拡大し、農作物が時間の流れと完全に1:1で成長するようにします:
$$\text{newRandomSpeed} = \min(500, \text{originalRandomTickSpeed} \times \text{stride})$$
5. 単調増加する世界時計のスナップ補正
目標起床時刻に到達すると、True Sleepは世界時計を厳密に単調増加方向へスナップさせます: $$\text{snappedTime} = \text{currentDay} + \text{wakeTime}$$ $$\text{if } \text{snappedTime} < \text{currentFull} \implies \text{snappedTime} += 24000L$$
これにより、世界時計が逆行することが一切なくなり、日照センサーや時間に依存するデータパックの正常な動作を保証します。
