Prinzipiell eine coole Sache, funktioniert aber nur, wenn jede Datei physisch auf dem Datenträger vorhanden ist. Wenn eine Datei nun z.B. innerhalb eines Archivs komprimiert vorliegt und diese beim Streamen dekomprimiert in den Speicher geladen werden funktioniert der Ansatz nicht mehr.
TDK hat geschrieben:Razor X, ehrlich gesagt, wieso machst du solch eine einfache Sache so kompliziert? Ich meine, du willst du keine CMS in einer einzelnen Datei haben, oder?
Naja einfache Sache ist nett gesagt, ists aber nicht. Wenn man mal deinen Ansatz in Betracht zieht, eben das Hashen mit MD5 der Dateipfade, so gibt es auch dort mit einer gewissen Wahrscheinlichkeit Probleme. Denn Hashfunktionen sind zwar darauf optimiert Kollisionen zu vermeiden, dennoch können diese auftreten. Was also, wenn ich zwei Dateien in meinem Bestand habe, die die selbe ID generieren? Ich könnte natürlich eine Überlauftabelle generieren, das löst das Problem der Speicherung, aber die Identifikation ist dann ein Ratespiel.
TDK hat geschrieben:
Denn was du bei der UUID-Idee nicht beachtest: Wie stellen deine Tools sicher, dass die UUID schon vergeben ist? Willst du jedes mal deinen gesamten Content durchlaufen (pro Datei), nur um eine gültige UUID zu bestimmten?
Diese Geschichte habe ich hier von einem Programm aus den Jahren 2003 - 2006. Und das Resultat ist im Bezug zur Performance und Qualität katastrophal und läuft auf viele Cache Files für nichts aus.
Genau das ist auch das Problem was ich dabei momentan sehe. Letztlich muss ein Objekt (Datei passt momentan weniger) eindeutig identifizierbar sein. Aber auch bei Namen kann es zu Konflikten kommen, wodurch das Argument nicht zieht.
Letztlich würd ich definitiv den numerischen Ansatz bevorzugen, denn ...
- ... das Speichern eines Strings ist definitiv speicherintensiver (wenn dann nur wie Krishty sagte im Debug-Modus und im Release muss das ganze durch IDs ersetzt werden)
- ... kann man in einer numerischen Repräsentation nette Informationen unterbringen, die durch logische Operationen abgeglichen werden können (der String müsste dafür erstmal geparst werden).
Desweiteren bin ich kein Fan davon für jede Klasse einen Manager zu bauen. Letztlich sind alles, ob Texturen, Meshes, Materialen etc, Assets die zum Laden, Speichern und Freigeben keiner weiteren Behandlung bedürfen. Das bedeutet doch das ich eine zentrale Datenbank (eine asset_database) benötige, denn auch nur so kann ich sicherstellen, dass ich eindeutige IDs verwende. Auch muss nicht jeder Manager einen asynchronen Ladethread für seine zu ladenen Objekte anlegen oder auch nicht das Freigeben von nicht genutzten Ressourcen implementieren. Jedes Asset wird freigegeben wenn es im Zeitraum x nicht benötigt wurde (das muss wahrlich nicht in verschiedenen Managern implementiert werden).