Mari kita pikirkan platform-agnostik: Saya ingin memuat beberapa sumber daya grafis sementara sisa permainan sedang berjalan.
Pada prinsipnya, saya dapat memuat file aktual pada utas terpisah, atau menggunakan async I / O. Tetapi dengan objek grafis, saya harus mengunggahnya ke GPU, dan itu (biasanya) hanya dapat dilakukan pada utas utama.
Saya dapat mengubah lingkaran permainan saya agar terlihat seperti ini:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
sementara memiliki sumber daya thread yang terpisah dari disk ke RAM.
Namun, jika ada banyak sumber daya yang besar untuk dimuat, ini dapat menyebabkan saya melewatkan tenggat waktu bingkai dan akhirnya mendapatkan bingkai yang dijatuhkan. Jadi saya bisa mengubah loop ke ini:
while true do
update()
if there are pending resources then
load one resource to gpu
remove that resource from the pending list
end
draw()
end
Secara efektif memuat hanya satu sumber daya per frame. Namun, jika ada banyak sumber daya kecil untuk dimuat, memuat semuanya akan membutuhkan banyak bingkai, dan akan ada banyak waktu terbuang.
Secara optimal, saya ingin menghitung waktu pemuatan saya dengan cara berikut:
while true do
time_start = get_time()
update()
while there are pending resources then
current_time = get_time()
if (current_time - time_start) + time_to_load(resource) >= 1/60 then
break
load one resource to gpu
remove that resource from the pending list
end
draw()
end
Dengan cara ini, saya hanya akan memuat sumber daya jika saya bisa melakukannya dalam waktu yang saya miliki untuk kerangka itu. Sayangnya, ini membutuhkan cara untuk memperkirakan jumlah waktu yang diperlukan untuk memuat sumber daya yang diberikan, dan sejauh yang saya tahu, biasanya tidak ada cara untuk melakukan ini.
Apa yang kulewatkan di sini? Berapa banyak game yang dapat memuat semua barang mereka sepenuhnya asinkron dan tanpa bingkai yang terjatuh atau waktu pemuatan yang sangat lama?