我一直在为OpenGL练习编写Minecraft副本(据我猜很多),但是在编写了基本的渲染API之后,我注意到真正的Minecraft占用了很多内存(大约800 MB)!我完全理解为什么它与所有必须记住的小块以及生成器的地形和地形数据一起存在。我问自己:“此小块与该小块完全相同。它们可以在代码中吗? ”并记得C ++具有指针,所以我试图用我能想到的唯一方法在Java中做同样的事情,即为每个块创建一个静态实例,而不使用new
关键字,这是最好的方法吗?似乎确实有帮助。.如果可能的话,我仍然希望它会更好?
这是有问题的课程。
public abstract class Block {
public static DirtBlock Dirt = new DirtBlock();
public static GrassBlock Grass = new GrassBlock();
public static RedstoneOreBlock RedstoneOre = new RedstoneOreBlock();
public static TNTBlock TNT = new TNTBlock();
public static MonsterSpawnerBlock Monserspawner = new MonsterSpawnerBlock();
public static BedrockBlock Bedrock = new BedrockBlock();
public static StoneBlock Stone = new StoneBlock();
public static GlassBlock Glass = new GlassBlock();
public static SandBlock Sand = new SandBlock();
public static WaterBlock Water = new WaterBlock();
public static SnowBlock Snow = new SnowBlock();
public static SnowGrassBlock SnowyGrass = new SnowGrassBlock();
public static IceBlock Ice = new IceBlock();
public static CoalBlock Coal = new CoalBlock();
对于100个块的世界,当前的内存使用量约为200MB,每个块由16个宽,64个高和16个深的块组成,总共1,638,400个块-每个块约128个字节。
最佳答案
是的,这是个好方法。它称为Flyweight模式。但是考虑使用对象工厂代替静态字段。从长远来看,这将使您的代码更具可测试性。
在计算机编程中,flyweight是一种软件设计模式。 flyweight是通过与其他类似对象共享尽可能多的数据来最大程度减少内存使用的对象。当简单的重复表示使用不可接受的内存量时,这是一种使用大量对象的方法。通常,对象状态的某些部分可以共享,通常的做法是将它们保存在外部数据结构中,并在使用它们时将它们临时传递给flyweight对象。
flyweight模式的一个典型示例用法是用于文字处理器中字符图形表示的数据结构。对于文档中的每个字符,可能希望有一个包含其字体轮廓,字体规格和其他格式数据的字形对象,但这对于每个字符而言总计数百或数千个字节。相反,对于每个字符,可能都引用了文档中相同字符的每个实例共享的flyweight字形对象。只有每个字符的位置(在文档和/或页面中)都需要在内部存储。
摘自Wikipedia,http://en.wikipedia.org/wiki/Flyweight_pattern