【Code-Snippet】自定义View

1. 硬件加速致使的自定义drawable的内存泄漏

摘自:硬件加速致使的自定义drawable的内存泄漏android

缘由
  • 在用canvas绘制图片时,若是对同一个view绘制屡次,会使native内存不断增加,native里内存不能释放,通过排查,最后发现是默认使用硬件加速致使的
  • 若自定义View中,有复杂的Path,尽管每次的使用都是同一个对象,Path.reset(),这些绘制都会用到纹理的遮罩。每当你建立或者修改一个path,硬件渲染过程都会建立一个新的遮罩,这耗费的代价是至关大的。从内存快照上看,每一次的修改或者从新绘制或者从新开启动画,Native层都会多出一大截内存,其是byte[]的急剧增长。
  • 每当修改一次bitmap的内容,(用canvas绘制最后仍是会获得bitmap)当你下次再绘制它的时候都会以GPU的纹理形式上传一次。多是这些致使native内存的增长
解决
  • 关闭硬件加速便可。

Application级别canvas

或者禁用如下级别的硬件加速:Application Activity Window 和 View 。
在你的Android Manifest文件中添加 属性标记,以便为整个应用程序使用硬件加速。
复制代码

Activity级别bash

若是你的应用程序不能在Application应用级别表现良好的话,则可使用对Activity进行单独控制。
要启动或者禁用一个Activity的硬件加速,你可使用activity的android:hardwareAccelerated属
性。下面的一个列子使整个Application启用硬件加速,可是对一个Activity禁止使用硬件加速。
复制代码

Window级别动画

  • 若是你须要更细粒度的控制,你能够经过以下代码给window进行加速。
getWindow().setFlags( 
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 
复制代码

View级别spa

  • 咱们能够对单独的View在运行时阶段禁用硬件加速。咱们可使用以下代码:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
复制代码
相关文章
相关标签/搜索