Pensons indépendamment de la plateforme: je veux charger des ressources graphiques pendant que le reste du jeu tourne.
En principe, je peux charger les fichiers réels sur un thread séparé ou utiliser des E / S asynchrones. Mais avec des objets graphiques, je devrai les télécharger sur le GPU, et cela ne peut (généralement) se faire que sur le thread principal.
Je peux changer ma boucle de jeu pour ressembler à ceci:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
tout en ayant un thread séparé chargez les ressources du disque vers la RAM.
Cependant, s'il y a beaucoup de grandes ressources à charger, cela pourrait me faire manquer une échéance de trame et éventuellement perdre des trames. Je peux donc changer la boucle en ceci:
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
Chargement efficace d'une seule ressource par trame. Cependant, s'il y a beaucoup de petites ressources à charger, le chargement de toutes prendra beaucoup de trames et il y aura beaucoup de temps perdu.
Idéalement, je voudrais chronométrer mon chargement de la manière suivante:
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
De cette façon, je ne chargerais une ressource que si je peux le faire dans le temps dont je dispose pour ce cadre. Malheureusement, cela nécessite un moyen d'estimer le temps qu'il faut pour charger une ressource donnée, et pour autant que je sache, il n'y a généralement aucun moyen de le faire.
Qu'est-ce que j'oublie ici? Comment de nombreux jeux arrivent-ils à charger tous leurs trucs de manière complètement asynchrone et sans perte d'images ou temps de chargement extrêmement longs?