"backing pixel data"和位图对象有什么区别?



我再次阅读http://developer.android.com/training/displaying-bitmaps/manage-memory.html。

我看不懂下面这行:

在Android 2.3.3 (API级别10)及更低版本上,位图的支持像素数据存储在本机内存中。它与位图本身是分开的,后者存储在Dalvik堆中。

支持像素数据位图对象有什么区别?

位图对象是bitmap类的一个实例。虽然我没有位图类的源代码在我面前,我认为它有以下私有成员变量:宽度,高度,颜色深度,"有alpha通道",dpi等…也就是说,程序或渲染器可能需要知道的关于图像本身的所有元数据。

支持像素数据是从用于创建此位图对象实例的源文件解码的实际未压缩(A)RGB字节。因此,如果位图表示从JPEG加载的640x480 24位图像,则可能在某处分配了一个640x480x3字节的后备数组,并且是bitmap类的私有成员。getPixel和setPixel等方法直接作用于数组。

关于Dalvik vs. Native memory的问题。要记住的是,位图对象使用大量内存。如果你的代码引用了太多的位图对象,它可能会耗尽内存。

你列出的网页链接的完整报价:

为这一课设置舞台,这里是Android的位图内存管理是如何演变的:在Android Android 2.2 (API级别8)及以下,当垃圾收集发生时,应用程序的线程停止。这会导致延迟这可能会降低性能。Android 2.3增加了并发垃圾Collection,这意味着在位图不再被引用。

在Android 2.3.3 (API级别10)和在更低的情况下,位图的支持像素数据存储在本机内存中。它与位图本身是分开的,后者存储在Dalvik中堆。本机内存中的像素数据不会以可预测的方式释放方式,可能导致应用程序短暂地超出其内存限制和崩溃。从Android 3.0 (API级别11)开始,像素数据和相关的位图一起存储在Dalvik堆上。

引语想说的是这个。位图使用大量内存,因为它们通常有一个大的内存分配来保存ARGB字节。在今天的Android操作系统上,当Bitmap对象不再被引用时,与Bitmap相关的ARGB字节将与Bitmap对象本身一起被垃圾收集。因此,只要Bitmap类的实例没有引用泄漏,垃圾收集器就会做正确的事情,防止内存耗尽——正如任何程序员可能希望和期望的那样。

在早期版本的Android上,ARGB字节由不同的运行时和垃圾收集器管理,与应用程序自己的Java/Dalvik运行时分开。所以在旧的Android模型上,仅仅因为Bitmap对象本身被垃圾收集清理了,图像字节可能会在很久以后被清理。因此,如果您要快速地持续加载和释放许多Bitmap,即使您做了所有正确的事情以确保由Java代码管理的Bitmap对象不再被引用,也可能会耗尽内存。

最新更新