Ich möchte mein geladenes Guthaben identifizieren, weiß aber nicht, welches ich auswählen soll. Es gibt 2 Möglichkeiten:
Name (Zeichenfolge)
- Dies ist am einfachsten und auch am schnellsten mit unordered_map (O (1)), aber viel langsamer als mit ganzen Zahlen.
- Leicht verständlich im Code.
Ganze Zahlen
- Am schnellsten
- Sind im Code nicht verständlich.
Ich weiß, dass Saiten nicht so sicher oder schnell sind, aber ist sie so schlecht oder zählt sie in einem AAA-Titel nur als schlecht? Ich könnte Aufzählungen erstellen, um Ganzzahlen zu verwenden, aber wenn ich die Szene, Assets usw. zur Laufzeit aus einer Datei lade, kann ich keine Aufzählungen verwenden. Gibt es eine Möglichkeit, diese Ganzzahlen lesbar zu machen, wenn sie zur Laufzeit generiert werden?
Ich weiß, dass dieses Problem einige Themen rund um das Internet hat, aber ich konnte nicht herausfinden, in welchen Fällen dies wichtig ist.
c++
architecture
assets
asset-management
Tudvari
quelle
quelle
Antworten:
Sie können beide unterstützen.
Während es zur Laufzeit oft effizienter ist, Assets mit einer Ganzzahl oder einem ähnlichen, schnell zu vergleichenden Schlüssel zu referenzieren, ist es zur Entwurfszeit oft effizienter, sie mit Namen zu referenzieren, da Menschen mit Namen wie viel besser umgehen können
enemy_bullet_casing_sound
als72910613
.Verwenden Sie einen Ganzzahlschlüssel, um die Ressourcen direkt nachzuschlagen, und verwenden Sie diese Ganzzahl nach Möglichkeit im Code (wobei Sie den tatsächlichen Wert der Ganzzahl in eine Variable einfügen und damit einfacher arbeiten können). Geben Sie eine Zuordnung von name zu diesem Ganzzahlschlüssel (und nicht direkt zur Ressource) an und verwenden Sie diese Zuordnung, wenn Sie auf benannte Verweise auf Assets stoßen, um den tatsächlichen Ganzzahlschlüssel aufzulösen und das Asset zu finden.
Durch die Verwendung der namensbasierten Suche wird die Arbeit mit Ihren Datendateien erheblich vereinfacht, und durch die Zuordnung des Namens zu einem schnelleren Schlüssel bleiben alle wichtigen Vorteile eines schnelleren Schlüssels vom Typ Integer erhalten, wo immer er benötigt wird.
quelle
In meinem Projekt verwende ich Hash-Strings, die zur Kompilierungszeit in eindeutige (ich wünsche!) Zahlen umgewandelt werden. Wenn ich also eine Ressource benötige, zum Beispiel eine Textur, rufe ich einfach auf
Und da ich ein einfaches Entity-System-Framework erstelle und Komponentendaten aus Dateien laden muss, habe ich eine einfache Sprache wie json erstellt, um Daten zu speichern, die aber kompilierbar ist (Umwandlung von Wörtern und Zeichen von Ziffern in Zahlen und von Zeichenfolgen in Hash-Werte). . Wenn ich zum Beispiel die Textur mit dem ID-Hash ("my_texture") mit "ball.PNG" in meiner Datendatei verknüpfen möchte, habe ich
Wo || ist ein Operator, der dem Compiler sagt, dass er das Wort darin hashen soll.
Im Grunde genommen verwende ich also Zeichenfolgen, die beim Kompilieren auf ints abgebildet werden (damit sie keinen Overhead verursachen), sowohl im eigentlichen Code als auch in den Dateien, die die Streams zum Laden von Komponenten darstellen. Für die Berechnung des Hashs eine Kompilierzeit einfach googeln, es ist eine einfache Funktion von 5-10 Codezeilen.
Natürlich können Sie den String aus Ihren Dateien laden und zur Laufzeit haschen. In diesem Fall müssen Sie das Wörterbuch nicht selbst schreiben, da der Algorithmus dies für Sie (Erstellen von Ganzzahlen aus Strings) und mich erledigt Ich denke, dass Hasing aufgrund der Speicherlokalität mindestens so schnell ist wie das Suchen in einer Karte (Sie durchlaufen lediglich eine Zeichenfolge, die nur wenige Bytes lang ist).
Hoffe das kann helfen.
quelle
Das Erkennen von Objekten anhand von Zeichenfolgen ist nicht optimal, da Ints viel effizienter sind. Der Einfachheit halber können Sie eine Zeichenfolgentabelle (oder ein Wörterbuch) mit Zeichenfolgen in Ints verwalten, um Sie bei der Entwicklung und beim Debuggen zu unterstützen.
Ich würde jedoch befürworten, dass Sie in Ihrem Hauptspielcode Objekte nur anhand ihrer Ganzzahl-ID (oder einer Aufzählung zur besseren Lesbarkeit) referenzieren. Auf diese Weise können Sie die Zeichenfolgentabelle einfacher als separates Asset aufteilen. Wenn sich Ihr Hauptspielcode nicht auf diese Zeichenfolgentabelle stützt, können Sie ihn aus dem veröffentlichten Spiel entfernen, wodurch möglicherweise eine erhebliche Menge an Speicher eingespart wird. Dies ist ein wichtiger Gesichtspunkt, wenn Sie an einem Mobilspiel arbeiten und die Downloadgröße so gering wie möglich halten möchten möglich.
quelle