Android 5.0 不支持 BitmapFactory.Options inPurgeable
Android 5.0 doesn't support BitmapFactory.Options inPurgeable
我正在学习 Facebook
的 fresco
库。我看到使用选项将位图存储在 ashmem
上 inPurgeable
太棒了。它让我们非常关心内存管理,但在 Davilk heap
上减少了 OutOfMemoryError
。
我想知道为什么 Android 5.0 不继续支持 BitmapFactory.Options
inPurgeable
.
ART
有什么变化吗?
任何人都可以为我解释原因吗?提前致谢。
编辑
根据 Ed George 的回答:
为什么 Facebook 工程师在 Android 3.0 -> 4.4 中仍然使用 inPurgeable?
他们是否为了性能可预测性而权衡 Dalvik 堆分配?
documentation 提供以下内容:
This field was deprecated in API level 21. As of LOLLIPOP, this is
ignored. In KITKAT and below, if this is set to true, then the
resulting bitmap will allocate its pixels such that they can be purged
if the system needs to reclaim memory. In that instance, when the
pixels need to be accessed again (e.g. the bitmap is drawn,
getPixels() is called), they will be automatically re-decoded.
进一步的解释似乎可以回答您的问题:
While inPurgeable can help avoid big Dalvik heap allocations (from API
level 11 onward), it sacrifices performance predictability since any
image that the view system tries to draw may incur a decode delay
which can lead to dropped frames. Therefore, most apps should avoid
using inPurgeable to allow for a fast and fluid UI. To minimize Dalvik
heap allocations use the inBitmap flag instead.
这在 Fresco 的 blog post 中得到了回答。请参阅 "Purgeable bitmaps" 和 "Having our cake and eating it too" 部分。如果您使用 Fresco,您将获得更快的性能和更少的 OOM,并且不会失去性能的可预测性。
请注意,尽管 Fresco 在管理位图内存方面也很麻烦,但要非常小心以避免内存泄漏并尽快关闭位图。如果您尝试自己使用 NDK 而不是使用 Fresco,则需要同样小心。
Google 也可以构建类似 Fresco 的解决方案作为 Android API 的一部分,但他们选择不这样做。公平地说,Android 5.0 有许多改进,使位图分配比以前更轻松。像位图这样的大对象放在堆上单独的内存space,单独进行垃圾回收,速度会快很多。所以也许他们觉得这就足够了。
我正在学习 Facebook
的 fresco
库。我看到使用选项将位图存储在 ashmem
上 inPurgeable
太棒了。它让我们非常关心内存管理,但在 Davilk heap
上减少了 OutOfMemoryError
。
我想知道为什么 Android 5.0 不继续支持 BitmapFactory.Options
inPurgeable
.
ART
有什么变化吗?
任何人都可以为我解释原因吗?提前致谢。
编辑
根据 Ed George 的回答:
为什么 Facebook 工程师在 Android 3.0 -> 4.4 中仍然使用 inPurgeable?
他们是否为了性能可预测性而权衡 Dalvik 堆分配?
documentation 提供以下内容:
This field was deprecated in API level 21. As of LOLLIPOP, this is ignored. In KITKAT and below, if this is set to true, then the resulting bitmap will allocate its pixels such that they can be purged if the system needs to reclaim memory. In that instance, when the pixels need to be accessed again (e.g. the bitmap is drawn, getPixels() is called), they will be automatically re-decoded.
进一步的解释似乎可以回答您的问题:
While inPurgeable can help avoid big Dalvik heap allocations (from API level 11 onward), it sacrifices performance predictability since any image that the view system tries to draw may incur a decode delay which can lead to dropped frames. Therefore, most apps should avoid using inPurgeable to allow for a fast and fluid UI. To minimize Dalvik heap allocations use the inBitmap flag instead.
这在 Fresco 的 blog post 中得到了回答。请参阅 "Purgeable bitmaps" 和 "Having our cake and eating it too" 部分。如果您使用 Fresco,您将获得更快的性能和更少的 OOM,并且不会失去性能的可预测性。
请注意,尽管 Fresco 在管理位图内存方面也很麻烦,但要非常小心以避免内存泄漏并尽快关闭位图。如果您尝试自己使用 NDK 而不是使用 Fresco,则需要同样小心。
Google 也可以构建类似 Fresco 的解决方案作为 Android API 的一部分,但他们选择不这样做。公平地说,Android 5.0 有许多改进,使位图分配比以前更轻松。像位图这样的大对象放在堆上单独的内存space,单独进行垃圾回收,速度会快很多。所以也许他们觉得这就足够了。