Bagaimana saya bisa menangani rendering pada banyak monitor dengan kecepatan refresh yang berbeda?

8

Apa cara terbaik untuk menghadapi situasi yang mungkin timbul, di mana pengguna memiliki dua atau lebih monitor dengan resolusi berbeda dan interval sinkronisasi vertikal?

Ini akan berlaku ketika permainan memiliki catatan waktu tetap, dan berjalan dalam mode berjendela: jika satu monitor memiliki frame rate 60.056, dan yang lainnya memiliki frame rate 59.94, sinkronisasi vertikal pada akhirnya akan gagal melakukan tugasnya, jika jendela game dipindahkan dari layar utama ke yang lain.

Aliasing sementara juga akan terjadi, karena catatan waktu tidak diselaraskan dengan benar ke laju sinkronisasi lainnya. Bagaimana gim biasanya menangani masalah ini?

NmdMystery
sumber
Apa - tepatnya - apa yang Anda coba lakukan?
Panda Pajama
@PandaPajama Saya mencoba untuk memungkinkan pemain untuk memindahkan jendela permainan di antara layar dengan lancar sehingga A) tidak terjadi robekan pada titik mana pun dan B) tidak ada bingkai yang diulang pada titik mana pun. Saya kira logika independen dari itu, jadi saya akan mengurangi ruang lingkup pertanyaan saya menjadi rendering saja.
NmdMystery
Anda hanya akan mendapatkan frame berulang jika logika game Anda berjalan lebih lambat dari kode rendering Anda. Pada 60 fps logika, pada 60.056 fps grafis, rata-rata Anda akan mendapatkan satu frame berulang setiap 18 detik. Ini membutuhkan waktu 0,017 detik, dan kemungkinan besar tidak akan terlihat. Jika Anda HARUS tidak memiliki frame berulang, Anda dapat memiliki logika permainan Anda pada framerate yang jauh lebih cepat. Katakan 200fps. Anda akan membuang banyak pemrosesan dan mendapatkan banyak frame yang terjatuh, tetapi Anda tidak akan mendapatkan frame yang berulang, yang tampaknya menjadi tujuan Anda.
Panda Pajama
Ini tentu saja berlaku untuk dunia dengan langkah waktu diskrit, yang mencakup sebagian besar kode game. Jika Anda dapat secara konsisten menghitung keadaan dunia game Anda untuk waktu yang sewenang-wenang ndalam waktu kurang dari O(n)kompleksitas (secara optimal O(1)), maka tidak satupun dari apa yang saya katakan berlaku. Simulasi interaktif tidak cenderung bekerja seperti itu.
Panda Pajama

Jawaban:

5

Langkah-langkah logika game tidak harus disinkronkan dengan logika tampilan, bahkan jika Anda menggunakan stempel waktu tetap.

Pertimbangkan gameloop seperti:

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

Tidak masalah berapa lama draw()panggilan Anda . Selama Anda do_step()kurang dari itu time_per_step, logika gim Anda tidak akan ketinggalan.

Piyama Panda
sumber
Bagaimana dengan merobek? Apakah solusi untuk perbedaan kecepatan penyegaran hingga ke vendor, atau apakah ada cara yang efisien untuk membuat pada waktu yang tepat di kedua layar tanpa mengalami pengalihan sementara pada salah satu dari mereka?
NmdMystery
Solusi ini kompatibel dengan vSync. Saya menggunakan 60 langkah bingkai logis per detik, tetapi Anda dapat memompanya naik atau turun sebanyak yang Anda inginkan.
Piyama Panda
Maksud saya adalah bahwa dengan gameloop ini, logika gim Anda akan selalu terbarui dengan jam waktu nyata. Dengan demikian, jika logika gambar Anda tidak sepenuhnya sinkron dengan logika permainan, algoritme ini akan mengulang atau menjatuhkan bingkai yang diperlukan untuk mengikuti jam waktu nyata. Apakah ini dapat diterima atau tidak, itu terserah Anda untuk memutuskan
Panda Pajama
Jadi saya harus memilih antara frame berulang dan merobek, pada dasarnya? Tidak ada alternatif lain?
NmdMystery
Yah, tapi itu menurut definisi. Jika Anda ingin Xframe logika per detik pada Yframe grafis per detik, untuk X != Y, Anda harus membuat logika keep to graphics (bingkai berulang dan terjatuh) atau grafik keep logic (merobek). Alternatif lainnya adalah force logic untuk dijalankan pada kecepatan grafik, yang akan mengarah pada aliasing sementara. Tidak ada ilmu roket di sini.
Piyama Panda