Ich schreibe gerade ein Spiel in Java, und ich versuche, ein paar einfache Design-Entscheidungen zu treffen, die Speicherverbrauch von Anfang an zu reduzieren (um zu verhindern, zu müssen) große Änderungen später, um die Speichernutzung zu reduzieren). Das Hauptlayout des Spiels wird ein Hex-Gitter sein, und ich werde eine HashMap
verwenden, um die Hexes zu speichern. Jeder Eintrag wird ein Point
Objekt als Schlüssel haben, und ein Hex
Objekt (Hex
ist eine Schnittstelle) als der Wert. Ich werde zwei verschiedene Objekte haben, die Hex
implementieren; OceanHex
und LandHex
.Speicherauslastung für Objekte, die nur statische Felder enthalten
Während LandHex
viele Felder (Gebäude, Statistiken, Spieler, die sich gerade auf der Kachel befinden) enthalten wird, werden Spieler nicht in der Lage sein, auf den Ozeanfliesen zu bauen oder sich darauf zu bewegen. Im Wesentlichen sind sie nur ästhetisch. Aus diesem Grund wird OceanHex
nur 2 statische Endmitglieder enthalten, was jede Instanz von OceanHex
gleich macht. Ich plante ursprünglich, die Speichernutzung zu reduzieren, indem ich nur eine Instanz instanziieren und jedes Ozeanplättchen auf diese Instanz verweisen ließ, aber das hat mich neugierig gemacht. Da OceanHex
nur statische Felder enthält, würden viele Instanzen von OceanHex
tatsächlich mehr Speicher als eine einzelne Instanz verwenden?
Im Allgemeinen ist meine Frage: für eine Klasse, die nur statische Felder enthält, würden viele Instanzen des Objekts den gleichen Platz einnehmen wie eine Instanz des Objekts mit vielen Referenzen darauf?
Ich könnte mir vorstellen, Instanzen von Klassen mit nur statischen Feldern ist selten, aber ich bin trotzdem neugierig.
Jedes zusätzliche Objekt wird noch * einen * Speicher aufnehmen, aber nicht so viel, als wenn die Felder Instanzfelder wären. Es ist jedoch definitiv korrekter, eine Singleton-Instanz zu erstellen, als eine Reihe von Instanzen mit statischen Feldern zu erstellen. – shmosel
Mein Rat ist: Machen Sie Ihr Design einfach, korrekt und einfach zu navigieren und in den meisten Fällen wird Speicherverbrauch für sich selbst sorgen. Wenn dies nicht der Fall ist, wird das Umschreiben einfach. Wenn Sie mit einem schrecklichen Design beginnen, werden die Dinge nur noch schlimmer werden. In diesem speziellen Fall macht es OceanEx zu einem Singleton, nicht weil es irgendwelche Überlegungen zum Speicherabdruck gibt, sondern die simple Tatsache, dass in Ihrer Welt alle Ozeanfelder logisch äquivalent sind. – biziclop
Übrigens ist der Ansatz, den Sie über die Verwendung einer einzelnen Kopie des "OceanHex" erwähnten, das Entwurfsmuster * Flyweight *, und macht Sinn, wenn jede "Instanz", wenn eine bestimmte konkrete Klasse nicht unterscheidbar ist. – chrylis