alwaystest / Blog

24 stars 2 forks source link

Android Bitmap与内存 #56

Open alwaystest opened 7 years ago

alwaystest commented 7 years ago

Android Bitmap与内存

标签(空格分隔): Android 优化 Bitmap 内存


前段时间看到Bugly团队的Android 内存优化总结&实践,里面有一句话是这么说的:

优化方式:我们通过将这三张图从xhdpi挪动到xxhdpi(当然这里需要看下图片显示效果有没很大的影响),以及在闪屏显示过后回收闪屏图片。

当时没有搞明白为什么资源文件放到不同的文件夹就能导致加载占用内存不同。问了群里的同学,找到了一个关键词density

Android性能优化之Bitmap的内存优化中提到了关于Density、分辨率、-hdpi等res目录之间的关系。我有一个地方不明白,DensityDPI和分辨率怎么能有直接对应关系呢,毕竟

densityDpi 是屏幕每英寸对应多少个点(不是像素点) Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?

大分辨率也能做到小密度,小分辨率也能做到大密度,和屏幕尺寸相关的呀。

回到问题,这里的关键点其实是inDensity 和 inTargetDensity

官方文档能获取到res目录和density之间的关系。

注意到其中有个 density 和 targetDensity,前者是 decodingBitmap 的 density,这个值跟这张图片的放置的目录有关(比如 hdpi 是240,xxhdpi 是480),这部分代码我跟了一下,太长了,就不列出来了;targetDensity 实际上是我们加载图片的目标 density,这个值的来源我们已经在前面给出了,就是 DisplayMetrics 的 densityDpi,如果是三星s6那么这个数值就是640。sx 和sy 实际上是约等于 scale 的,因为 scaledWidth 和 scaledHeight 是由 width 和 height 乘以 scale 得到的。我们看到 Canvas 放大了 scale 倍,然后又把读到内存的这张 bitmap 画上去,相当于把这张 bitmap 放大了 scale 倍。 Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?

所以结果很明白了,Bitmap加载的内存占用决定因素不止是BitmapFactory.Options.inSampleSizeinDensity 和 inTargetDensity也对Bitmap的内存占用有影响。

要掌握Bitmap优化,需要弄清楚这些:

  1. BitmapFactory.Options的各个参数
  2. Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存? 计算Bitmap占用内存大小真的绕不过