Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

05.02.2013, 17:40

Ja, aus irgendeinem Grund hatte ich angenommen, auch im Falle der Proxyobjekte Pointer zurückzugeben... Das habe ich mittlerweile in meinem Code schon nachbessert. Dabei ist mir aufgefallen, dass getResource dadurch keinen nullptr mehr zurückgeben kann. Stattdessen müsste ich wohl entweder
  • eine Exception werfen, wenn die Ressource nicht gefunden wird oder
  • boost::optional für den Rückgabewert benutzen oder
  • eine Ressource oder einen Smart Pointer darauf per Referenz an die Methode übergeben und modifizieren lassen.
Die Lösung mit der Exception gefällt mir persönlich gerade am besten und der dritte Punkt beantwortet eventuell auch schon meine an H5 gestellte Frage bzgl. seiner RessourceManager::Resource-Methode: Ein nullptr lässt sich ja auch nicht nach weak_ptr typecasten.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

12

05.02.2013, 22:31

Liegt aber wohl auch an meinem Code Style, Rückgabewerte sind bei mir nur Resultate. So ist es einheitlich im Code. Auch im Zusammenhang mit den Templates (z.B. Kommentare im Code von mir) kann so die Signatur der Methode benutzt werden um Typsicherheit zu erreichen. Der Rückgabewert einer Methode ist nicht Bestandteil der Signatur. Man hat dadurch einheitliche Methodennamen und einheitliche Signaturen, deswegen benutze ich auch die neue Schreibweise konsequent so ist alles einheitlich lesbar.
Auch im Zusammenhang mit Lambdas und std::function usw. ist die Signatur wichtig, so kann der Compiler z.B. passende Funktoren auswählen.

Edit:
Achso, und so kannst du auch uniqe_pointer nutzen, die können ja nicht kopiert werden. weak_ptr dienen dazu zirkuläre Probleme mit shared_ptr zu vermeiden die dazu führen könne das jeweils ein shared_ptr eine Referenz auf einen anderen hat und sie so nie gelöscht werden.
:love: := Go;

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »H5::« (05.02.2013, 22:39)


13

09.02.2013, 15:21

Danke nochmals für eure Hinweise und Ratschläge. Ich bin jetzt ein gutes Stück mit dem Ressourcenmanager vorangekommen, auch wenn er letztendlich ganz anders geworden ist, als ich ursprünglich geplant hatte.

Falls jemand mehr über das Ergebnis wissen möchte: Der Ressourcenmanager ist nun eine nichtgenerische Klasse, die eine unbestimmte Anzahl an Ressourcenkatalogen verwaltet. Jeder Ressourcenkatalog bildet jeweils eine XML-Datei ab, in der Ressourcendefinitionen gespeichert sind (Pfade zu den Ressourcen + Metainformationen). Ressourcen werden folgendermaßen geladen:

auto texture = manager.getResource<Texture>("xml/pfad/zur/ressourcendefinition", "resources.xml");

Mithilfe eines optionalen dritten Parameters können sprachabhängige Ressourcen geladen werden:

auto text = manager.createResource<Text>("mission4/anweisungen", "missions.xml", "en");

In der obigen Zeile sieht man auch die von H5 vorgeschlagene createResource-Methode. Sie dient dazu, eine Ressource zu laden, die nicht vom Manager gecacht wird.

Zu guter Letzt gibt es jetzt auch eine Referenzzählung für die Ressourcen, damit u.a. auch soetwas möglich ist:

manager.removeUnusedResources();

Dadurch bleiben Ressourcen verschont, auf die während des ganzen Spiels immer wieder zurückgegriffen wird (z.B. die Texturen für das Spielmenü).

Es sind noch nicht alle Funktionen vollständig implementiert und ein paar kleine Unschönheiten wollen noch ausgebügelt werden. Der Manager hat jetzt aber alle Features, die ich brauche; vielleicht kommen später noch Ressourcendateien hinzu, in denen die Kataloge samt zugehöriger Ressourcen gezippt sind. Aber das hat für mich eher eine Gimmick-Priorität. ;)

Werbeanzeige