我一直在为 OpenGL 练习编写 Minecraft 复制品(我猜有很多),但是在编写了基本渲染 API 后,我注意到真正的 Minecraft 使用了lot或内存 - 大约 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 字节。
Yes,这是一个好办法。它被称为蝇量级图案。但考虑使用对象工厂来代替静态字段。从长远来看,这将使您的代码更具可测试性。
在计算机编程中,享元是一种软件设计模式。享元是一种通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象;当简单的重复表示会使用不可接受的内存量时,这是一种使用大量对象的方法。通常,对象状态的某些部分可以共享,通常的做法是将它们保存在外部数据结构中,并在使用时临时将它们传递给享元对象。
享元模式的一个典型用法是用于文字处理器中字符的图形表示的数据结构。对于文档中的每个字符,可能需要一个包含其字体轮廓、字体规格和其他格式数据的字形对象,但这对于每个字符来说将达到数百或数千字节。相反,对于每个字符,可能存在对文档中同一字符的每个实例共享的享元字形对象的引用;仅需要在内部存储每个字符的位置(在文档和/或页面中)。
来自维基百科,http://en.wikipedia.org/wiki/Flyweight_pattern
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)