java - Bitmap 对象是否通过引用保存在内存中?

标签 java android pointers object bitmap

请原谅我提出的这个问题可能令人难以置信(我对 Java 和 Android Studio 都很陌生)。我有 C 语言背景,目前正在使用 Android Studio 为 Google Play 开发移动应用程序。该应用程序需要为游戏创建许多敌人对象。

考虑以下为敌人对象创建位图的方法;

在GamePanel类中(父类是SurfaceView,实现SurfaceHolder.Callback);

enemy = new Enemy(BitmapFactory.decodeResource(getResources(), R.drawable.enemy_pic));

在 Enemy 类中,我们的图像被声明为实例变量;

private Bitmap image;

然后我们在构造函数中对其进行初始化(picResource 是构造函数中的第一个参数);

image = picResource;

我的问题如下 - 如果我创建一个敌人对象列表(有很多敌人!),这会导致位图数据重复吗?我从文档中不确定它的较低级别实现是否会模拟 C 中的指针行为,因此以这种方式构建它只会产生最小的开销,或者我是否会消耗内存,因为我本质上是在复制 C 中的所有数据。图片文件。

最佳答案

I create a list of enemy objects (there are lots of enemies!), will this result in the duplication of the Bitmap data?

每次调用decodeResource()将产生一个新的内存位图。如果您像问题中那样创建所有敌人:

enemy = new Enemy(
    BitmapFactory.decodeResource(getResources(), R.drawable.enemy_pic)
);

每个Enemy对象都会有自己独特的位图。

也就是说,如果你把它放在一个循环中

List<Enemy> enemies = new ArrayList<>();
for (int i = 0; i < nEnemies; ++i) {
   enemy = new Enemy(
       BitmapFactory.decodeResource(getResources(), R.drawable.enemy_pic)
   );
   enemies.add(enemy);
}

您将获得 nEmemies 位图,即每个 Enemy 对象都有自己的(内存中)位图。

如果您仅解码敌人位图一次并将生成的引用传递给 Enemy 构造函数,则只需创建对单个现有位图的新引用。即,将上面重写为(例如)

List<Enemy> enemies = new ArrayList<>();
Bitmap enemyBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.enemy_pic);
for (int i = 0; i < nEnemies; ++i) {
   enemy = new Enemy(enemyBitmap);
   enemies.add(enemy);
}

结果只有一个单个位图被所有敌人共享(除非Enemy对位图做了一些操作来创建一个副本)。

返回引用您的答案。在 Java 中,赋值形式为

image = picResource;

不创建副本,而仅创建附加引用(准确地说,这只适用于引用类型,即对象)。

旁注:如果您使用 Context.getDrawable() ,您可以利用 Android 的可绘制缓存,即使重复调用也可以获得相同的可绘制。

关于java - Bitmap 对象是否通过引用保存在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677197/

相关文章:

java - 从不拥有它的线程解锁锁,或重新设计以避免这种情况?

java - 同一个类跑5次

android - 如何访问android中其他应用程序的共享偏好数据?

c语言移动指针后如何释放它

c - 修改后指针没有改变

c - 释放后重新分配给指针变量

java - Jsoup 在文本节点中发出 "实体

java - DropDownChoice 并按返回按钮

java - Gradle 同步失败。构建失败,出现异常。 build.gradle 内容异常? IDE fatal error

Android 在从另一个 Activity 返回并重新打开应用程序时保存动态添加的 viewpager 的 fragment