Platformdan bağımsız düşünelim: Oyunun geri kalanı devam ederken bazı grafik kaynakları yüklemek istiyorum.
Prensip olarak, gerçek dosyaları ayrı bir iş parçacığına veya zaman uyumsuz G / Ç kullanarak yükleyebilirim. Ancak grafik nesnelerle, bunları GPU'ya yüklemem gerekecek ve bu (genellikle) yalnızca ana iş parçacığında yapılabilir.
Oyun döngümü böyle bir şeye benzeyecek şekilde değiştirebilirim:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
diskten RAM'e ayrı bir iş parçacığı yük kaynakları var.
Ancak, yüklenecek birçok büyük kaynak varsa, bu bir çerçeve son tarihini kaçırmama ve sonunda bırakılan çerçevelere ulaşmama neden olabilir. Bu yüzden döngüyü buna değiştirebilirim:
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
Her çerçeve için yalnızca tek bir kaynağı etkili bir şekilde yükleme. Ancak, yüklenecek çok sayıda küçük kaynak varsa, bunların tümünü yüklemek çok sayıda çerçeve alacak ve çok fazla zaman harcanacaktır.
Optimal olarak, yüklememi aşağıdaki şekilde zamanlamak istiyorum:
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
Bu şekilde, yalnızca bu çerçeve için sahip olduğum süre içinde yapabilirsem bir kaynak yüklerdim. Ne yazık ki, bu belirli bir kaynağı yüklemek için gereken süreyi tahmin etmenin bir yolunu gerektirir ve bildiğim kadarıyla, bunu yapmanın genellikle bir yolu yoktur.
Burada ne eksik? Birçok oyun, tüm eşyalarını tamamen eşzamansız olarak ve atlanan kareler veya aşırı uzun yükleme süreleri olmadan nasıl yükleyebilir?