2017-03-20 3 views
0

現在、Javaでゲームを作成していますが、私はいくつかの簡単な設計上の決定を下して、メモリ使用量を削減します大きな変更は後でメモリ使用量を減らす)。ゲームの主なレイアウトはヘクスグリッドになり、ヘクスを格納するためにHashMapを使用します。各エントリはPointオブジェクトをキーとして持ち、Hexタイプのオブジェクト(Hexはインターフェイスです)値として。 Hexを実装する2つの異なるオブジェクトを作成します。 OceanHexおよびLandHexスタティックフィールドのみを含むオブジェクトのメモリ使用

LandHexには多くのフィールド(建物、統計、現在タイルに載っているプレイヤー)が含まれていますが、プレーヤーは上に建てたり、海のタイルに移動することはできません。本質的に、彼らはただの美意識です。このため、OceanHexには2つの静的最終メンバーが含まれ、OceanHexの各インスタンスは同じになります。もともと私は1つのインスタンスOceanHexをインスタンス化し、それぞれの海洋タイルにそのインスタンスを参照させるだけでメモリ使用量を減らすことを計画しましたが、これは私に不思議を感じました。 OceanHexには静的フィールドしか含まれていないので、OceanHexの多くのインスタンスは実際には1つのインスタンスより多くのメモリを使用しますか?

一般的に私の質問は:静的なフィールドだけを含むクラスの場合、オブジェクトのインスタンスが多数あると、オブジェクトのインスタンスが1つ多く存在することになります。

私は静的なフィールドだけを持つクラスのインスタンスを作成することはまれだと思いますが、私は興味があります。

+0

各追加オブジェクトは、* some *メモリを占有しますが、フィールドがインスタンスフィールドであるかのようにはなりません。しかし、静的フィールドを持つ一連のインスタンスを作成するよりも、シングルトンインスタンスを作成する方が正しい方法です。 – shmosel

+4

私のアドバイスは:あなたのデザインをシンプルで正確にナビゲートするようにしてください。そして、しばしば、メモリ使用量がそれ自身を世話するでしょう。そうでない場合は、簡単に書き直すことができます。あなたが恐ろしいデザインから始めると、事態はさらに悪化します。この特定のケースでは、「OceanHex」をシングルトンにすることは、メモリーのフットプリントに関する考慮事項ではなく、あなたの世界ではすべての海洋分野が論理的に同等であるという単純な事実に完全な意味を持ちます。 – biziclop

+0

ちなみに、「OceanHex」の1つのコピーの使用について述べたアプローチは、* Flyweight *のデザインパターンです。特定の具体的なクラスが区別できない場合は、すべての「インスタンス」が意味を持ちます。 – chrylis

答えて

3

すべてのインスタンスでメモリを使用しますが、ほとんどのマシンでは無視されます(詳細はthis questionを参照)。メモリー使用量を避けるために複雑さ(シングルトンなど)を導入することを考慮する必要があるのは、非常に限られたハードウェアで実行している場合や、非常に多数のオブジェクトを持つ場合です。私は、これらのいずれかがゲームに当てはまるとは思わない。シンプルで明確なコードを探してから、問題がある場合は後でリソースを最適化してください。

インスタンスを共有する場合は、実装の詳細についてFlyweight Design Patternをご覧ください。

0

はい、各インスタンスはメモリを消費します。

このように考えると、すべてがObjectから継承されます。したがって、あなたが何かのnewインスタンスを作るたびに、それは最低でもObjectのインスタンスです。

1

インスタンスを1つまたは複数インスタンス化するかどうかにかかわらず、常に同じ数の参照があります。多くのものが同じオブジェクトを指しているか、多くは多くのオブジェクトを指しています。

参照の数が同じであるため、実際には次のようになります。多くのオブジェクトが1つのオブジェクトより多くのメモリを使いますか?

静的性質が本当に重要でない理由は、少なくともヘッダーとGCフットプリントを持つオブジェクトをインスタンス化するためです。

答えがあります:はいもっと多くのオブジェクトが使用されるメモリが増えています。

+0

しかし、それほどではありません。 – biziclop

関連する問題