リフレッシュレートの異なる複数のモニターでレンダリングを処理するにはどうすればよいですか?


8

ユーザーが解像度と垂直同期間隔が異なる2台以上のモニターを使用している場合に発生する可能性のある状況に対処するための最良の方法は何ですか?

これは、ゲームのタイムステップが固定されており、ウィンドウモードで実行されている場合に当てはまります。一方のモニターのフレームレートが60.056で、もう一方のモニターのフレームレートが59.94である場合、垂直同期は最終的にその仕事に失敗します。ゲームウィンドウがメイン画面から別の画面に移動した。

タイムステップが他の同期レートに適切に調整されていないため、一時的なエイリアシングも発生します。ゲームは通常、この問題にどのように対処しますか?


あなたが何をしようとしているのか-正確に-
パンダパジャマ2013年

@PandaPajama私は、プレーヤーが画面間でゲームウィンドウをスムーズに移動できるようにして、A)いかなる点でもティアリングが発生しないようにし、B)いかなる点でもフレームが繰り返されないようにします。ロジックはそれとは独立していると思うので、質問の範囲をレンダリングのみに限定します。
NmdMystery 2013年

ゲームロジックの実行がレンダリングコードよりも遅い場合にのみ、フレームが繰り返されます。60ロジックfps、60.056グラフィックfpsでは、平均して18秒ごとに1つのフレームが繰り返されます。これには0.017秒かかり、ほとんど気付かれません。DEFINITELYにフレームの繰り返しが絶対にない場合は、ゲームロジックをはるかに高速なフレームレートで使用できます。200fpsと言います。多くの処理を浪費し、多くのフレームが欠落しますが、フレームの繰り返しは得られません。これが目的のようです。
パンダパジャマ2013年

これはもちろん、ゲームコードの大部分を含む、離散時間ステップのある世界に有効です。複雑さ(最適)n未満で任意の時間のゲーム世界の状態を一貫して計算できる場合、私が言ったことのいずれも当てはまりません。対話型シミュレーションは、そのように機能する傾向はありません。O(n)O(1)
パンダパジャマ2013年

回答:


5

固定タイムステップを使用している場合でも、ゲームロジックステップを表示ロジックと同期させる必要はありません。

次のようなゲームループについて考えてみましょう。

var time_per_step = 1 / 60 -- for 60 -logic- steps per second
var prev_time = get_time() -- in seconds

while true do
    var curr_time = get_time()
    while prev_time < curr_time do
        do_step()
        prev_time = prev_time + time_per_step
        // optional: curr_time = get_time()
    end
    draw()
end

draw()通話にかかる時間は重要ではありません。do_step()が未満であればtime_per_step、ゲームロジックが遅れることはありません。


引き裂いてはどうですか?ベンダーごとに異なるリフレッシュレートの解決策はありますか、それとも、どちらか一方で一時的なエイリアスが発生することなく、両方の画面で適切なタイミングでレンダリングする効率的な方法はありますか?
NmdMystery 2013年

このソリューションはvSyncと互換性があります。私は毎秒60の論理フレームステップを使用しましたが、必要に応じてそれを増減できます。
パンダパジャマ2013年

私のポイントは、このゲームループでは、ゲームロジックは常にリアルタイムクロックで最新の状態になるということです。そのため、描画ロジックがゲームロジックと正確に同期していない場合、このアルゴリズムは、リアルタイムクロックに追いつくために、必要に応じてフレームを繰り返すかドロップします。これが受け入れられるかどうかは、あなた次第です
Panda Pajama 2013年

つまり、本質的には、繰り返しフレームとティアリングのどちらかを選択する必要がありますか?他に選択肢はありませんか?
NmdMystery 2013年

まあ、しかしそれは定義によるものです。X1秒あたりのYグラフィックフレームで1秒あたりのロジックフレームが必要な場合、についてはX != Y、ロジックをグラフィック(繰り返しフレームとドロップフレーム)に維持するか、グラフィックをロジック(ティアリング)に維持する必要があります。もう1つの方法は、ロジックをグラフィックス速度で実行することを強制することです。これにより、一時的なエイリアシングが発生します。ここにはロケット科学はありません。
パンダパジャマ2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.