请原谅我提出的这个问题可能令人难以置信(我对 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/