¿Cómo puedo manejar el renderizado en múltiples monitores con diferentes frecuencias de actualización?

8

¿Cuál es la mejor manera de lidiar con una situación que puede surgir, en la que un usuario tiene dos o más monitores con diferentes resoluciones e intervalos de sincronización vertical?

Esto se aplicaría cuando un juego tiene un intervalo de tiempo fijo y se ejecuta en modo de ventana: si un monitor tiene una velocidad de fotogramas de 60.056 y el otro tiene una velocidad de fotogramas de 59.94, la sincronización vertical finalmente no hará su trabajo, si la ventana del juego se mueve de la pantalla principal a otra.

También se producirá un alias temporal, ya que el paso de tiempo no está sintonizado adecuadamente con la otra velocidad de sincronización. ¿Cómo suelen los juegos lidiar con este problema, si es que lo hacen?

NmdMystery
fuente
¿Qué es exactamente lo que estás tratando de hacer?
Panda Pyjama
@PandaPajama Estoy tratando de permitir que el jugador mueva la ventana del juego entre pantallas sin problemas para que A) no se rompa en ningún punto y B) no se repitan cuadros en ningún punto. Supongo que la lógica es independiente de eso, así que reduciré el alcance de mi pregunta a solo renderizar.
NmdMystery
Solo obtendrá cuadros repetidos si la lógica de su juego es más lenta que su código de representación. A 60 fps lógicos, a 60.056 fps gráficos, en promedio obtendrá un cuadro repetido cada 18 segundos. Esto lleva 0.017 segundos, y lo más probable es que no se note. Si DEFINITIVAMENTE NO DEBE tener fotogramas repetidos, puede tener su lógica de juego a una velocidad de fotogramas mucho más rápida. Di 200 fps. Perderás mucho procesamiento y obtendrás muchos cuadros caídos, pero no obtendrás cuadros repetidos, lo que parece ser tu propósito.
Panda Pijama
Por supuesto, esto es válido para un mundo con pasos de tiempo discretos, que abarca la gran mayoría del código del juego. Si puede calcular constantemente el estado de su mundo de juego durante un tiempo arbitrario nen menos de O(n)complejidad (óptimamente O(1)), entonces nada de lo que dije se aplica. Sin embargo, las simulaciones interactivas no tienden a funcionar así.
Panda Pijama

Respuestas:

5

Los pasos de la lógica del juego no tienen que estar sincronizados con la lógica de la pantalla, incluso si está utilizando un paso de tiempo fijo.

Considere un gameloop como:

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

Realmente no importa cuánto demoren sus draw()llamadas. Mientras su do_step()toma menos time_per_step, su lógica de juego no se quedará atrás.

Pijama Panda
fuente
¿Qué tal el desgarro? ¿La solución para diferentes frecuencias de actualización depende del proveedor, o hay una manera eficiente de renderizar en el momento correcto en ambas pantallas sin experimentar alias temporal en una de ellas?
NmdMystery
Esta solución es compatible con vSync. Utilicé 60 pasos de cuadro lógico por segundo, pero puedes subirlo o bajarlo todo lo que quieras.
Panda Pijama
Mi punto es que con este gameloop, la lógica de tu juego siempre estará actualizada con el reloj en tiempo real. Como tal, si su lógica de dibujo no está exactamente sincronizada con la lógica del juego, este algoritmo repetirá o soltará fotogramas según sea necesario para mantenerse al día con el reloj en tiempo real. Si esto es aceptable o no, depende de usted decidir
Panda Pyjama
Entonces, ¿tengo que elegir entre cuadros repetidos y rasgado, esencialmente? No hay otras alternativas?
NmdMystery
Bueno, pero eso es por definición. Si desea Xcuadros lógicos por segundo en Ycuadros gráficos por segundo, X != Ytendrá que hacer que la lógica se mantenga en los gráficos (cuadros repetidos y descartados) o los gráficos se mantengan en la lógica (desgarro). La otra alternativa es forzar la lógica para que se ejecute a la velocidad de los gráficos, lo que conducirá a un alias temporal. No hay ciencia espacial aquí.
Panda Pijama