Ressourcenmanager - Sind sie gut?

20

Ich habe so manche Male im Quellcode gesehen [nun, das ist eher eine Pseudo-C ++ Idee von mir]

typedef shared_ptr<Resource> ResourcePtr;// for ease  
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");  
sound1->Play();  
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");

Ich habe mich nur gefragt, wie nützlich eine Klasse wie diese ist, etwas, das:

  • Geladene Mediendateien
  • Gespeichert sie in Erinnerung
  • Hab das zu Beginn eines Level-Ladebildschirms gemacht.
  • Aufgeräumt

Anstatt ein System von:

  • Ressourcen werden nur von Unternehmen gehalten oder sind lose.
  • Verantwortlich für das eigene Laden in den Speicher.

Der erste ist ein "Manager" als solcher; Etwas, von dem ich glaube, dass es falsch ist, es zu benutzen. Sie können jedoch so etwas wie einen Vektor von Ressourcennamen übergeben, anstatt sich um alles zu bemühen, was geladen werden muss.

Die kommunistische Ente
quelle
1
Nicht genau. Ich denke, das ist eine berechtigte Frage.
Ricket
Nicht ganz, aber ähnliche Bereiche und ähnliche Vor- und Nachteile. Aber es gibt Dinge, die Sie mit dem Manager tun würden, die Sie mit einem Manifest nicht tun würden. Manifeste sind dumme Dinge, die einfach unterschiedliche Ressourcen in einem einzigen Index zusammenfassen. Ein Ressourcenmanager kann viel mehr Verantwortung übernehmen und eine bessere Anbindung an die Spiel-Engine gewährleisten.
MrCranky
Ich glaube nicht, dass ich dasselbe frage. Das scheint zu fragen, ob Sie eine Art Dateipfadkürzung haben sollten, wohingegen ich nach einer Art Ressource-Ladeprogramm / Cache-Typ frage. Ich denke jedoch, dass dies nicht in der Suche auftauchte, da ich eher Ressourcen als Vermögenswerte verwendete.
Die kommunistische Ente
2
@ Bryan, ich bin anderer Meinung, "Sind Vermögensverwalter eine gute Idee?" Ist eine andere Frage als "Wie implementieren Sie Vermögensverwalter?". Zugegeben, einige Leute haben versucht, die erste Frage für die zweite Frage zu beantworten, was zu großen Überschneidungen bei den Antworten führen würde.
Tetrad

Antworten:

20

Ein guter Ressourcenmanager ist der Schlüssel dafür, wie gut und wie flexibel Ihre Spiel-Engine sein wird.

Es löst nicht nur viele Probleme mit der Ressourcenverwaltung auf niedriger Ebene, sondern stellt auch sicher, dass Ressourcen nur einmal geladen und dann wiederverwendet werden, wenn sie bereits geladen sind.

Wenn das Ressourcensystem gut abstrahiert ist, können die zugrunde liegenden Details zwischen Dateisystem, physischem Speicher, SQL und sogar ... variieren.

Sie fordern einfach eine Ressource an, die Ihnen zur Verfügung gestellt wird.

Sie müssen sich keine Gedanken über Ressourcen-IDs und ähnliches machen.

Umgang mit doppelten Ressourcenkonflikten usw.

Lassen Sie den Ressourcenmanager das klären.

Abhängig davon, wie Sie es entwerfen - wenn C ++, machen Sie sich mit Ihren Szenemanagement-Klassen bekannt, um sicherzustellen, dass das Eigentum ordnungsgemäß behandelt wird.

Ressourcenpool ?

Kein Problem.

Vergessen, Ressourcen freizugeben?

Kein Problem.

Gleiche Schnittstelle zu Ressourcen, egal wo sie sich befinden: Speicher, Festplatte, Archiv, Netzwerk.

Kein Problem.

Möchtest du Streaming?

Einfädeln?

Lassen Sie dies von Ihrem Ressourcen-Management-Hub erledigen.

Sie können sich darauf verlassen, dass Sie darüber informiert werden, wenn die Ressourcen zur Verwendung bereit sind.

Ogre 3D verfügt über ein sehr flexibles Ressourcenmanagementsystem, aber ich bin mir sicher, dass es auch andere gibt.

jacmoe
quelle
1
Ich muss Ihnen für diese Antwort danken. Ich war von der Nützlichkeit eines dedizierten Ressourcenmanagers nicht überzeugt, bevor ich dies gelesen habe, und jetzt werde ich sehr bald einen implementieren.
Jake McArthur
13

Ich habe kürzlich einen Ressourcenmanager geschrieben, der für meinen Fall ziemlich gut funktioniert. Haupteigenschaften:

  • Ressourcen werden beispielsweise nach Zeichenfolgen-ID angefordert ResourceManager::instance().getTexture("textures/player.png"). Die Textur-ID wird derzeit direkt einer Datei auf der Festplatte zugeordnet, was während der Entwicklung praktisch ist. Diese wird jedoch später in einigen Archiven durch eine Suche ersetzt.

  • Der Ressourcenmanager behält eine Zuordnung von IDs zu Ressourcen bei, sodass eine bereits geladene Ressource nicht erneut geladen wird.

  • Der obige Aufruf gibt kein TextureObjekt zurück, sondern ein Resource<Texture>Objekt. Es wird erwartet, dass der Aufrufer das Resource<Texture>Objekt und nicht die tatsächliche Textur speichert . Das Resource<Texture>wirkt wie ein kluger Zeiger auf ein Texture; Es operator*()gibt das TextureObjekt selbst zurück. Der Vorteil ist, dass die tatsächliche Textur neu geladen oder entladen werden kann, ohne dass alle Clients aktualisiert werden müssen.

  • Der Ressourcenmanager prüft regelmäßig, ob sich Dateien auf der Festplatte geändert haben, und lädt sie gegebenenfalls neu. Auf diese Weise kann ich Texturen oder Shader ändern und das Ergebnis anzeigen, ohne das Spiel neu zu starten.

  • Ressourcen können voneinander abhängig sein. Die meisten, wenn nicht alle Ressourcen hängen von einer FileRessource ab, der Datei, aus der sie geladen wurden. Wenn ein Modell beispielsweise von einer Textur abhängt, wird das Modell jedes Mal neu geladen, wenn sich die Texturdatei auf der Festplatte ändert.

  • Wenn eine Ressource nicht gefunden wird oder nicht geladen werden kann, wird eine Standardressource automatisch ersetzt. Auf diese Weise kann ich Ressourcen verwenden, die ich noch nicht erstellt habe, ohne das Spiel zum Absturz zu bringen. (Geplante Funktion: Geben Sie "wichtige" Ressourcen wie GPGPU-Shader an, ohne die das Spiel überhaupt nicht ordnungsgemäß ausgeführt werden kann.)

  • Die Referenzzählung und das Entladen nicht verwendeter Ressourcen können problemlos hinzugefügt werden. Da mein Spiel ziemlich klein ist, hatte ich noch keinen Bedarf dafür.

Ich denke, dass diese Feature-Liste zeigt, dass Ressourcenmanager gut sein können!

Thomas
quelle
2

Einer der Gründe für einen Ressourcenmanager ist die gemeinsame Nutzung von Ressourcen. Wenn Sie beispielsweise resourceManager.Get("sprite.png")"sprite.png" aufrufen , kann der Ressourcenmanager einfach einen Zeiger auf die bereits geladene Sprite-Ressource zurückgeben, anstatt ein neues Image zu erstellen und von der Festplatte neu zu laden.

Ein Ressourcenmanager kann auch Ressourcen zwischenspeichern, sodass der Ressourcenmanager, obwohl der letzte Verweis auf eine Ressource gelöscht wurde, festlegen kann, dass sie im Speicher bleibt, falls sie in naher Zukunft erneut geladen wird. Der Ressourcenmanager ist so programmiert, dass er automatisch die gesamte Speicherverwaltung für Ihre Ressourcen übernimmt.

Schließlich denke ich, dass ein sehr nützliches Feature das Nachladen von Ressourcen im Spiel ist. Da der Ressourcenmanager Handles für alle Spielressourcen besitzt, können Sie eine Funktion einbauen, mit der alle Ressourcen von der Festplatte neu geladen werden und das Spiel in Echtzeit aktualisiert wird. Dies ist äußerst nützlich für Künstler / Designer, die mit Ihrem Spiel arbeiten .

5ound
quelle
1

Ein weiterer Vorteil ist, dass es neben Caching und Referenzzählung auch Abhängigkeiten (Modell a benötigt Textur b? Ich bekomme es für dich!) Und Probleme mit der Ladereihenfolge (Modell a muss wissen, was Shader b benötigt? Lass mich Shader laden) verarbeiten kann b vor dem Laden des Modells!)

Kaj
quelle