Vamos pensar como independentes de plataforma: quero carregar alguns recursos gráficos enquanto o resto do jogo está em execução.
Em princípio, posso carregar os arquivos reais em um thread separado ou usando E / S assíncrona. Mas com objetos gráficos, terei que enviá-los para a GPU, e isso (normalmente) só pode ser feito no thread principal.
Eu posso mudar o loop do meu jogo para algo parecido com isto:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
enquanto um thread separado carrega recursos do disco para a RAM.
No entanto, se houver muitos recursos grandes para carregar, isso poderá me levar a perder o prazo de um quadro e, eventualmente, ser descartado. Então eu posso mudar o loop para isso:
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
Carregando efetivamente apenas um recurso por quadro. No entanto, se houver muitos recursos pequenos para carregar, carregar todos eles levará muitos quadros e haverá muito tempo perdido.
Idealmente, gostaria de cronometrar meu carregamento da seguinte maneira:
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
Dessa forma, eu só carregaria um recurso se pudesse fazê-lo dentro do tempo que tenho para esse quadro. Infelizmente, isso requer uma maneira de estimar o tempo necessário para carregar um determinado recurso e, tanto quanto eu sei, geralmente não há maneiras de fazer isso.
O que estou perdendo aqui? Como muitos jogos carregam todas as suas coisas completamente assíncronas e sem quadros perdidos ou tempos de carregamento extremamente longos?