これが何か正確には100%理解してるわけじゃないけど、ラグをなくすためのGGPOと基本的に同じアイデアのランアヘッドには詳しいよ: - エミュレーターを通常通り1フレーム実行して、リアルなポーリング入力を使う。で、状態をスナップショットする。 - その後、同じ入力でエミュレーターをnフレーム(通常は1フレームだけ)実行する。最後のフレームの動画と音声を表示する。 - 同期する。(一部のエミュレーターはかなり高度なことができて、単にvsyncを待つだけじゃなく、処理時間を見積もってウィンドウの終わりまで遅延させて、最後の瞬間に入力をポーリングすることもある。) - 保存したスナップショットにロールバックする。(入力が本当に変わっていないとわかっているなら、ロールバックを避けるために最適化できると思うけど、フレーム時間が予測しづらくなるかも。)このアイデアが良い理由は、ほとんどのゲームが設計上、ある程度の処理遅延を持っているからで、フレームを1つか2つ先に進めても目立った副作用がないことが多いから。現代のコンピュータはLCDスクリーンで、古いシンプルなマシンに比べてどこでも遅延が多いから、これは結構クールなアイデアだよね。残念ながら、このアプローチはエミュレーターの状態が小さくて速く復元できるときだけ有効なんだ。実は、もっと現代のコンソール向けにこれを実現できるか実験してみたいと思ってる。例えば、userfaultfd/MEM_WRITE_WATCHを使ってダーティメモリページを追跡したり、全体のキャッシュを落とさずに巻き戻しできるようにJITキャッシュのような構造を設計したりできるかも。すべてのエミュレーターが状態を読み込むときにキャッシュをクリアするかはわからないけど、一般的には、もしそれを最初から設計するなら、セーブステートをどれくらい速く小さくできるか知りたいな。