Давайте думать независимо от платформы: я хочу загрузить некоторые графические ресурсы во время работы остальной части игры.
В принципе, я могу загрузить реальные файлы в отдельном потоке или с помощью асинхронного ввода-вывода. Но с графическими объектами мне придется загружать их в графический процессор, а это (обычно) можно сделать только в основном потоке.
Я могу изменить свой игровой цикл, чтобы он выглядел примерно так:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
имея отдельный поток загрузки ресурсов с диска в оперативную память.
Однако, если есть много больших ресурсов для загрузки, это может привести к тому, что я пропущу крайний срок и в конечном итоге получу пропущенные кадры. Так что я могу изменить цикл на это:
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
Эффективно загружает только один ресурс на кадр. Однако если загружать много мелких ресурсов, загрузка всех из них займет много кадров, и будет потрачено много времени.
Оптимально, я хотел бы рассчитать время загрузки следующим образом:
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
Таким образом, я только загрузил бы ресурс, если бы мог сделать это в течение времени, которое у меня есть для этого кадра. К сожалению, это требует способа оценить количество времени, которое требуется для загрузки данного ресурса, и, насколько я знаю, обычно нет способов сделать это.
Что мне здесь не хватает? Как многие игры загружают все свои вещи полностью асинхронно, без пропущенных кадров или очень долгого времени загрузки?