我正在学习fresco
的{{1}}库。我看到在Facebook
上存储位图的选项ashmem
非常棒。我们需要对内存管理进行大量关注,但inPurgeable
上的OutOfMemoryError
会减少。
我想知道为什么Android 5.0不会持续支持Davilk heap
BitmapFactory.Options
inPurgeable
是否有任何变化?
谁能解释一下我的原因?提前谢谢。
修改
根据Ed George的回答:
为什么Facebook工程师仍然使用Android 3.0中的inPurgeable - > 4.4?
他们是否将Dalvik堆分配与性能可预测性进行权衡?
答案 0 :(得分:3)
这在Fresco的blog post中得到了解答。请参阅"可清除位图"和#34;吃蛋糕,吃它也是#34;。如果您使用Fresco,您将获得更快的性能和更少的OOM,并且您不会失去性能可预测性。
请注意,虽然Fresco在管理位图内存方面也遇到了很多麻烦,但要小心避免内存泄漏并尽快关闭位图。如果你自己尝试使用NDK而不是使用Fresco,那么你需要同样小心。
作为Android API的一部分,谷歌也可以构建类似Fresco的解决方案,但他们选择不这样做。公平地说,Android 5.0有许多改进,使位图分配比以前更少痛苦。像位图这样的大对象被放置在堆上的单独内存空间中并单独进行垃圾收集,这要快得多。所以也许他们认为这就足够了。答案 1 :(得分:2)
documentation提供以下内容:
该字段在API级别21中已弃用。自LOLLIPOP起,这是 忽略。在KITKAT及以下,如果将此设置为true,则为 结果位图将分配其像素,以便可以清除它们 如果系统需要回收内存。在那种情况下,当 需要再次访问像素(例如绘制位图, 调用getPixels()),它们将被自动重新解码。
进一步解释似乎回答了你的问题:
虽然inPurgeable可以帮助避免大型Dalvik堆分配(来自API 等级11),它牺牲了性能可预测性,因为任何 视图系统尝试绘制的图像可能会导致解码延迟 这会导致掉帧。因此,大多数应用应该避免 使用inPurgeable可以实现快速流畅的UI。尽量减少Dalvik 堆分配使用inBitmap标志。