2

我一直在为 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 个字节。

4

1 回答 1

1

的,这是一个好方法。它被称为享元模式。但不是静态字段,而是考虑使用对象工厂。从长远来看,这将使您的代码更具可测试性。

在计算机编程中,享元是一种软件设计模式。享元是一种通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象;当简单的重复表示将使用不可接受的内存量时,这是一种使用大量对象的方法。通常可以共享对象状态的某些部分,通常的做法是将它们保存在外部数据结构中,并在使用时将它们临时传递给享元对象。

享元模式的典型用法是文字处理器中字符图形表示的数据结构。对于文档中的每个字符,可能需要一个包含其字体轮廓、字体度量和其他格式数据的字形对象,但这对于每个字符来说将达到数百或数千字节。相反,对于每个字符,都可能引用文档中同一字符的每个实例共享的享元字形对象;只有每个字符的位置(在文档和/或页面中)需要在内部存储。

来自维基百科,http ://en.wikipedia.org/wiki/Flyweight_pattern

于 2013-06-17T20:11:39.673 回答