プラットフォームにとらわれずに考えてみましょう。ゲームの残りの部分を実行している間に、グラフィックリソースをロードしたいと思います。
原則として、実際のファイルを別のスレッドにロードするか、非同期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
フレームごとに1つのリソースのみを効果的にロードします。ただし、ロードする小さなリソースが多数ある場合、それらすべてのロードには多くのフレームがかかり、多くの無駄な時間がかかります。
最適には、次の方法でロードの時間を計りたいと思います。
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
このようにして、そのフレームの時間内にリソースをロードできる場合にのみ、リソースをロードします。残念ながら、これには特定のリソースをロードするのにかかる時間を見積もる方法が必要であり、私の知る限り、これを行う方法は通常ありません。
ここで何が欠けていますか?多くのゲームは、すべてのコンテンツを完全に非同期で、フレームのドロップや非常に長いロード時間なしにロードできますか?