2017-03-20 3 views
0

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.

+0

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

+4

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

+0

Ü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

Antwort

3

Obwohl jede Instanz Speicher verwendet, ist sie auf den meisten Computern vernachlässigbar (Details siehe this question). Die einzige Zeit, die Sie in Erwägung ziehen sollten, Komplexität einzuführen (z. B. ein Singleton), um Speicherauslastung zu vermeiden, ist, wenn Sie mit sehr eingeschränkter Hardware arbeiten oder wenn Sie eine sehr große Anzahl von Objekten haben möchten. Ich bezweifle, dass beides für ein Spiel zutrifft. Gehen Sie zunächst zu einfachem, klarem Code und dann zu späteren Ressourcenoptimierungen, wenn Sie ein Problem haben.

Wenn Sie Ihre Instanzen freigeben möchten, empfehle ich Ihnen, einen Blick auf die Flyweight Design Pattern für Details zur Implementierung zu werfen.

0

Ja, jede Instanz nimmt Speicher.

Denken Sie stattdessen so: Alles erbt von Object. Jedes Mal, wenn Sie eine new Instanz von etwas erstellen, ist es daher mindestens eine Instanz einer Object.

1

Unabhängig davon, ob Sie eine einzelne Instanz oder mehrere Instanzen instanziieren, haben Sie immer die gleiche Anzahl an Referenzen. Entweder viele zeigen auf dasselbe Objekt oder viele zeigen auf viele Objekte.

Da die Anzahl der Referenzen gleich ist, stellt sich die Frage: Haben viele Objekte mehr Speicher als ein einzelnes Objekt?

Der Grund, warum die statische Natur nicht wirklich wichtig ist, ist, weil Sie immer noch Objekte instanziieren würden, die alle mindestens eine Kopfzeile und einen GC-Fußabdruck haben.

Die Antwort ist also: Ja mehr Objekte bedeuten mehr Speicher verwendet.

+0

Aber nicht viel. – biziclop

Verwandte Themen