Denken wir plattformunabhängig: Ich möchte einige grafische Ressourcen laden, während der Rest des Spiels läuft.
Im Prinzip kann ich die eigentlichen Dateien in einen separaten Thread laden oder asynchrone E / A verwenden. Aber bei grafischen Objekten muss ich sie auf die GPU hochladen, und das kann (normalerweise) nur im Haupt-Thread durchgeführt werden.
Ich kann meine Spielschleife so ändern, dass sie ungefähr so aussieht:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
während ein separater Thread Ressourcen von der Festplatte in den RAM laden.
Wenn jedoch viele große Ressourcen geladen werden müssen, kann dies dazu führen, dass ich eine Frame-Frist verpasse und schließlich Frames fallen lasse. Also kann ich die Schleife folgendermaßen ändern:
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
Effektiv nur eine Ressource pro Frame laden. Wenn jedoch viele kleine Ressourcen geladen werden müssen, dauert das Laden aller Ressourcen viele Frames und es wird viel Zeit verschwendet.
Optimalerweise möchte ich mein Laden folgendermaßen zeitlich festlegen:
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
Auf diese Weise würde ich eine Ressource nur laden, wenn ich dies innerhalb der Zeit tun kann, die ich für diesen Frame habe. Leider erfordert dies eine Möglichkeit, die Zeit abzuschätzen, die zum Laden einer bestimmten Ressource benötigt wird, und meines Wissens gibt es normalerweise keine Möglichkeiten, dies zu tun.
Was fehlt mir hier? Wie viele Spiele können all ihre Inhalte vollständig asynchron und ohne ausgelassene Frames oder extrem lange Ladezeiten laden?