Pomyślmy bez względu na platformę: Chcę załadować trochę zasobów graficznych, gdy reszta gry jest uruchomiona.
Zasadniczo mogę ładować rzeczywiste pliki do osobnego wątku lub używając asynchronicznych operacji we / wy. Ale w przypadku obiektów graficznych będę musiał przesłać je do procesora graficznego, co można (zwykle) zrobić tylko w głównym wątku.
Mogę zmienić swoją pętlę gry, aby wyglądała mniej więcej tak:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
mając osobny wątek ładujący zasoby z dysku na pamięć RAM.
Jednak jeśli istnieje wiele dużych zasobów do załadowania, może to spowodować, że spóźnię się z terminem ramki i ostatecznie spadną ramki. Więc mogę zmienić pętlę na to:
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
Skutecznie ładuje tylko jeden zasób na ramkę. Jednak jeśli istnieje wiele małych zasobów do załadowania, załadowanie ich wszystkich zajmie wiele ramek i będzie dużo zmarnowanego czasu.
Optymalnie chciałbym zaplanować ładowanie w następujący sposób:
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
W ten sposób załadowałbym zasób tylko wtedy, gdy mogę to zrobić w czasie, który mam dla tej ramki. Niestety wymaga to sposobu oszacowania czasu potrzebnego do załadowania danego zasobu, a o ile wiem, zwykle nie ma na to sposobów.
Czego tu brakuje? Jak wiele gier ładuje wszystkie swoje rzeczy całkowicie asynchronicznie i bez pomijania klatek lub wyjątkowo długiego czasu ładowania?