Pensiamo alla piattaforma indipendente: voglio caricare alcune risorse grafiche mentre il resto del gioco è in esecuzione.
In linea di principio, posso caricare i file effettivi su un thread separato o utilizzando I / O asincrono. Ma con gli oggetti grafici, dovrò caricarli sulla GPU, e questo (di solito) può essere fatto solo sul thread principale.
Posso cambiare il mio ciclo di gioco per assomigliare a questo:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
pur avendo un thread separato caricare risorse dal disco alla RAM.
Tuttavia, se ci sono molte grandi risorse da caricare, ciò potrebbe farmi perdere una scadenza dei frame e alla fine perdere i frame. Quindi posso cambiare il ciclo in questo:
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
Caricamento efficace di una sola risorsa per frame. Tuttavia, se ci sono molte piccole risorse da caricare, caricarle tutte richiederà molti frame e ci vorrà molto tempo perso.
In modo ottimale, vorrei programmare il mio caricamento nel modo seguente:
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
In questo modo, caricarei una risorsa solo se posso farlo entro il tempo che ho per quel frame. Sfortunatamente, questo richiede un modo per stimare il tempo necessario per caricare una determinata risorsa e, per quanto ne so, di solito non ci sono modi per farlo.
Cosa mi sto perdendo qui? In che modo molti giochi riescono a caricare tutte le loro cose in modo completamente asincrono e senza frame caduti o tempi di caricamento estremamente lunghi?