我一直在为OpenGL练习编写Minecraft副本(我猜多少),但是在编写基本渲染API之后,我注意到真正的Minecraft使用了很多或内存 - 大约800MB!我完全可以理解为什么这与它必须记住的所有块以及生成器的怪物和可能的地形数据...我问自己“这个块与那个块完全相同......它们是否在代码中? “并且记得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个字节。
答案 0 :(得分:1)
是,这是一个好方法。它被称为 Flyweight 模式。但是,考虑使用对象的工厂而不是静态字段。从长远来看,这将使您的代码更易于测试。
在计算机编程中,flyweight是一种软件设计模式。 flyweight是一个通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象;当简单的重复表示将使用不可接受的内存量时,它是一种大量使用对象的方法。通常可以共享对象状态的某些部分,并且通常的做法是将它们保存在外部数据结构中,并在使用它们时临时将它们传递给flyweight对象。
flyweight模式的典型示例用法是用于字处理器中字符的图形表示的数据结构。对于文档中的每个字符,可能需要包含字体轮廓,字体度量和其他格式数据的字形对象,但是对于每个字符,这将达到数百或数千个字节。相反,对于每个字符,可能存在对文档中相同字符的每个实例共享的flyweight字形对象的引用;只需要在内部存储每个字符的位置(在文档和/或页面中)。