指针 - 减少内存消耗

2023-12-08

我一直在为 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(使用前将#替换为@)

指针 - 减少内存消耗 的相关文章

  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 如何将毫秒转换为天、小时、分钟

    我尝试这样做 long Plptime player getStatistic Statistic PLAY ONE TICK 50L from ticks to ms 1 tick 20 each sec by 50 gives apro
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • 我的 Kafka 流应用程序刚刚退出,代码为 0,什么也不做

    为了尝试 Kafka 流 我这样做了 public static void main String args final StreamsBuilder builder new StreamsBuilder final Properties
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • 为 REST API 生成 Swagger UI 文档

    我使用 Java 中的 JAX RS Jersey 开发了 REST API 我想为其转换 生成基于 Swagger 的 UI 文档 谁能以简单的方式告诉我如何做到这一点的精确 步骤 很抱歉 他们网站上给出的步骤对我来说有点模糊 有多种方法
  • 在 Kotlin 中声明静态属性?

    My Java code public class Common public static ModelPengguna currentModelPengguna public class Common companion object v
  • 在 Spring MVC 中将请求写入文件

    我希望能够将整个请求写入 Spring MVC 控制器中的文件 我已尝试以下操作 但即使我使用大量参数发出 POST 请求 文件也始终为空 RequestMapping method RequestMethod POST value pay
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐