Ich bin mit Vittorio nicht einverstanden, dass kein gemeinsames Eigentum an Ressourcen erforderlich ist, und obwohl ich die Implementierung von nicht mag shared_ptr
, kann sie gut funktionieren.
Sie möchten eine gemeinsame Eigentümerschaft, da natürlich möglicherweise mehrere Spielobjekte dieselbe Ressource verwenden. Noch wichtiger ist, dass Sie, wenn Sie mehrere Ebenen haben und die Ebenen mindestens laden möchten, eine Möglichkeit benötigen, die Vereinigung und Schnittmenge der von beiden benötigten Ressourcen zu berechnen.
Eine Möglichkeit, dies zu tun, die mehr als nur ein erfordert shared_ptr
, besteht darin, das "Laden" eines Levels ohne Ressourcen zu ermöglichen und es das gemeinsame Eigentum an den benötigten Ressourcen übernehmen zu lassen. Entladen Sie dann das alte Level und entfernen Sie dessen Besitz. Laden Sie dann für jede Ressource, deren Eigentümer noch aktiv ist, die jedoch nicht geladen ist, die Ressource.
Für eine Ressource A, die von Level 1 und 2 benötigt wird, lautet der Referenzzähler ungefähr wie folgt:
load level 1
ref=1
load A
load level 2
ref=2
unload level 1
ref=1
Für eine Ressource B, die nur von Stufe 1 verwendet wird, gilt Folgendes:
load level 1
ref=1
load B
load level 2
ref=1
unload level 1
ref=0 (removed)
Und eine Ressource C, die nur von Stufe 2 verwendet wird, sieht folgendermaßen aus:
load level 1
ref=0 (implicit, as no resource C exists)
load level 2
ref=1
unload level 1
load C
Eine Methode könnte darin bestehen, eine Indirektionsebene zu haben. Sie speichern shared_ptr
in einem ResourceHolder
. Diese Inhaber sind auch in einer Liste irgendeiner Art. Beim Laden eines Levels erstellen Sie diese ResourceHolder
Objekte und halten sie fest . Sie enthalten a unique_ptr
zur eigentlichen Ressource (anfangs nullptr
) und den Pfad oder andere Informationen, die zum eventuellen Laden des Elements erforderlich sind.
Nachdem Sie die neue Ebene geladen und die alte entladen haben, können Sie die Liste der Live- ResourceHolder
Objekte durchlaufen, nach Objekten suchen, die ein nullptr
Handle für die eigentliche Ressource haben, und diese dann laden. Wenn das shared_ptr
to a ResourceHolder
eine Ref-Anzahl von 0 erreicht und es entlädt, gibt es natürlich auch die Ressource frei, und Sie sollten sicherstellen, dass es sich selbst aus der Liste der Live-Ressourcen entfernt.
Sie können es viel besser machen als, shared_ptr
aber es ist ein perfekter Ort, um loszulegen. Optimieren Sie es später zu etwas Besserem, sobald Sie ein funktionierendes Spiel haben.