Wie kann ich mit dem Rendern auf mehreren Monitoren mit unterschiedlichen Aktualisierungsraten umgehen?

8

Was ist der beste Weg, um mit einer Situation umzugehen, in der ein Benutzer zwei oder mehr Monitore mit unterschiedlichen Auflösungen und vertikalen Synchronisationsintervallen hat?

Dies würde gelten, wenn ein Spiel einen festen Zeitschritt hat und im Fenstermodus ausgeführt wird: Wenn ein Monitor eine Bildrate von 60,056 und der andere eine Bildrate von 59,94 hat, wird die vertikale Synchronisierung letztendlich ihre Aufgabe nicht erfüllen, wenn die Das Spielfenster wird vom Hauptbildschirm auf einen anderen verschoben.

Zeitliches Aliasing tritt ebenfalls auf, da der Zeitschritt nicht richtig auf die andere Synchronisierungsrate abgestimmt ist. Wie gehen Spiele normalerweise mit diesem Problem um, wenn überhaupt?

NmdMystery
quelle
Was genau ist das, was Sie versuchen zu tun?
Panda Pyjama
@PandaPajama Ich versuche dem Spieler zu erlauben, das Spielfenster reibungslos zwischen den Bildschirmen zu bewegen, so dass A) zu keinem Zeitpunkt ein Zerreißen auftritt und B) zu keinem Zeitpunkt Frames wiederholt werden. Ich denke, die Logik ist davon unabhängig, daher werde ich den Umfang meiner Frage auf das reine Rendern reduzieren.
NmdMystery
Sie erhalten nur wiederholte Frames, wenn Ihre Spielelogik langsamer als Ihr Rendering-Code ausgeführt wird. Bei 60 Logik-fps und 60,056 Grafik-fps erhalten Sie durchschnittlich alle 18 Sekunden einen wiederholten Frame. Dies dauert 0,017 Sekunden und wird höchstwahrscheinlich nicht bemerkt. Wenn Sie definitiv keine wiederholten Frames haben müssen, können Sie Ihre Spiellogik mit einer viel schnelleren Framerate haben. Sagen wir 200fps. Sie werden viel Verarbeitung verschwenden und viele abgelegte Frames erhalten, aber Sie werden keine wiederholten Frames erhalten, was Ihr Zweck zu sein scheint.
Panda Pyjama
Dies gilt natürlich für eine Welt mit diskreten Zeitschritten, die den größten Teil des Spielcodes umfasst. Wenn Sie den Zustand Ihrer Spielwelt für eine beliebige Zeit nin weniger als der O(n)Komplexität (optimal O(1)) konsistent berechnen können , gilt nichts von dem, was ich gesagt habe. Interaktive Simulationen funktionieren jedoch nicht so.
Panda Pyjama

Antworten:

5

Spiellogikschritte nicht haben , um mit Anzeigelogik synchronisiert werden, auch wenn Sie einen festen Zeitschritt verwenden.

Betrachten Sie einen Gameloop wie:

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

Es spielt keine Rolle, wie lange Ihre draw()Anrufe dauern. Solange Sie do_step()weniger als time_per_stepbrauchen, wird Ihre Spiellogik nicht zurückfallen.

Panda Pyjama
quelle
Wie wäre es mit reißen? Ist die Lösung für unterschiedliche Aktualisierungsraten bis zum Anbieter oder gibt es eine effiziente Möglichkeit, auf beiden Bildschirmen zum richtigen Zeitpunkt zu rendern, ohne dass auf einem von ihnen ein zeitliches Aliasing auftritt?
NmdMystery
Diese Lösung ist mit vSync kompatibel. Ich habe 60 logische Frame-Schritte pro Sekunde verwendet, aber Sie können diese beliebig hoch- oder runterpumpen.
Panda Pyjama
Mein Punkt ist, dass mit diesem Gameloop Ihre Spiellogik immer mit der Echtzeituhr auf dem neuesten Stand ist. Wenn Ihre Zeichenlogik nicht genau mit der Spielelogik synchronisiert ist, wiederholt oder löscht dieser Algorithmus Frames nach Bedarf, um mit der Echtzeituhr Schritt zu halten. Ob dies akzeptabel ist oder nicht, liegt bei Ihnen zu entscheiden
Panda Pyjama
Also muss ich mich im Wesentlichen zwischen wiederholten Frames und Zerreißen entscheiden? Keine anderen Alternativen?
NmdMystery
Nun, aber das ist per Definition. Wenn Sie Xlogische Frames pro Sekunde für Ygrafische Frames pro Sekunde wünschen X != Y, müssen Sie entweder dafür sorgen, dass die Logik bei den Grafiken bleibt (wiederholte und abgelegte Frames) oder die Grafiken bei der Logik bleiben (Zerreißen). Die andere Alternative ist das Erzwingen, dass die Logik mit Grafikgeschwindigkeit ausgeführt wird, was zu zeitlichem Aliasing führt. Keine Raketenwissenschaft hier.
Panda Pyjama