让我们考虑与平台无关的问题:我想在游戏其余部分运行时加载一些图形资源。
原则上,我可以将实际文件加载到单独的线程上,也可以使用异步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这样,我将仅在能够在该帧时间内完成的情况下加载资源。不幸的是,这需要一种方法来估计加载给定资源所花费的时间,据我所知,通常没有办法做到这一点。
我在这里想念什么?许多游戏如何完全异步地加载所有内容,而又不会丢帧或加载时间过长?