我目前正在用Java编写游戏,我正在尝试做一些简单的设计决策,这些决策将减少内存使用量(以防止以后必须进行大量更改以减少内存使用量)。游戏的主要布局将是一个十六进制网格,我将使用HashMap
来存储十六进制。每个条目将有一个Point
对象作为键,并且{ {1}}类型对象(Hex
是一个接口)作为值。我将有两个实现Hex
的不同对象; Hex
和OceanHex
。
虽然LandHex
将包含很多字段(建筑物,统计数据,当前位于图块上的玩家),但玩家将无法建立或移动到海洋地块上。从本质上讲,它们只是美学。因此,LandHex
仅包含2个静态最终成员,使OceanHex
的每个实例都相同。我最初计划通过仅实例化一个OceanHex
实例并让每个海洋地块引用该实例来减少内存使用量,但这让我很好奇。由于OceanHex
仅包含静态字段,因此OceanHex
的许多实例实际上会使用比单个实例更多的内存吗?
一般来说,我的问题是:对于只包含静态字段的类,对象的许多实例会占用与具有多个引用对象的一个对象实例相同的空间量吗?
我想创建只有静态字段的类的实例很少见,但我很好奇。
答案 0 :(得分:3)
虽然每个实例都使用内存,但在大多数机器上都可以忽略不计(详见this question)。您应该考虑引入复杂性(例如单例)以避免内存使用的唯一情况是,当您在非常有限的硬件上运行或者您打算拥有非常大量的对象时。我怀疑其中任何一个都适用于游戏。首先考虑简单明了的代码,然后在遇到问题时查看优化资源。
如果您决定分享您的实例,我建议您查看Flyweight Design Pattern了解实施细节。
答案 1 :(得分:1)
无论是实例化单个实例还是多个实例,都将始终具有相同数量的引用。许多人指向同一个对象或许多指向许多对象。
由于引用的数量相同,问题实际上变成了:许多对象占用的内存多于单个对象。
静态性质并不重要的原因是因为您仍然会实例化至少具有标题和GC足迹的对象。
所以答案是:是的,更多的对象意味着更多的内存使用。
答案 2 :(得分:0)
是的,每个实例都会记忆。
相反地想一想:一切都来自Object
。因此,每次制作某个new
实例时,它至少都是Object
的实例。