Pensemos en una plataforma independiente: quiero cargar algunos recursos gráficos mientras se ejecuta el resto del juego.
En principio, puedo cargar los archivos reales en un hilo separado, o usar E / S asíncrona. Pero con los objetos gráficos, tendré que subirlos a la GPU, y eso (por lo general) solo se puede hacer en el hilo principal.
Puedo cambiar mi ciclo de juego para que se vea así:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
mientras tiene un hilo separado, cargue recursos del disco a la RAM.
Sin embargo, si hay muchos recursos importantes para cargar, esto podría hacer que pierda una fecha límite de cuadros y, finalmente, se caigan los cuadros. Entonces puedo cambiar el ciclo a esto:
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
Efectivamente cargando solo un recurso por cuadro. Sin embargo, si hay muchos recursos pequeños para cargar, cargarlos todos tomará muchos fotogramas y habrá mucho tiempo perdido.
De manera óptima, me gustaría cronometrar mi carga de la siguiente manera:
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
De esta manera, solo cargaría un recurso si puedo hacerlo dentro del tiempo que tengo para ese marco. Desafortunadamente, esto requiere una forma de estimar la cantidad de tiempo que lleva cargar un recurso dado, y que yo sepa, generalmente no hay formas de hacerlo.
¿Que me estoy perdiendo aqui? ¿Cómo pueden muchos juegos cargar todas sus cosas de forma completamente asíncrona y sin cuadros caídos o tiempos de carga extremadamente largos?