让我们考虑与平台无关的问题:我想在游戏其余部分运行时加载一些图形资源。
原则上,我可以将实际文件加载到单独的线程上,也可以使用异步I / O。但是对于图形对象,我将不得不将它们上传到GPU,并且(通常)只能在主线程上完成。
我可以将游戏循环更改为如下所示:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
同时有单独的线程将资源从磁盘加载到RAM。
但是,如果有很多大资源要加载,这可能会导致我错过帧截止日期并最终丢失帧。所以我可以将循环更改为此:
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
这样,我将仅在能够在该帧时间内完成的情况下加载资源。不幸的是,这需要一种方法来估计加载给定资源所花费的时间,据我所知,通常没有办法做到这一点。
我在这里想念什么?许多游戏如何完全异步地加载所有内容,而又不会丢帧或加载时间过长?