本文介绍: 原因就是此方法会导致native的内存暴增,前提条件你使用surfaceview去绘制一些复杂的3D图形,绘制复杂、业务复杂的场景;setVisibility方法会调用surfaceView的updateSurface,而此方法内部就可能会分配大量的native内存。
谨慎使用android.view.SurfaceView.setVisibility方法
why?
原因就是此方法会导致native的内存暴增,前提条件你使用surfaceview去绘制一些复杂的3D图形,绘制复杂、业务复杂的场景;
setVisibility方法会调用surfaceView的updateSurface,而此方法内部就可能会分配大量的native内存
分析
如上函数,重点在于满足creating为true的情况下new SurfaceControl.Builder,在这个builder里面,会直接创建SurfaceControl对象,在SurfaceControl构造方法中有一个:
nativeCreate是一个native方法,在native层的代码如下:
到这里就不继续往下分析,不过也不难看出就是要重新创建一个surface,上面的createSurfaceChecked方法中的“IGraphicBufferProducer”代码就是分配对应的图像内存的例证;所以从上surfaceView的setVisibility方法很有可能就在native层分配内存,如果频繁调用setVisibility方法,而又没做好回收工作,就极有可能使内存暴增,系统和应用奔溃,出现android.view.Surface$OutOfResourcesException异常
如果频繁setVisiviblity方法分配内存,系统会将当前surface对象之前分配的内存回收掉吗?
看了SurfaceView的updateSurface函数,里面有将之前创建的SurfaceControl回收掉,但是回收掉有一些列条件,比较复杂,我也没去深入的研究,有兴趣的可以自行去分析;
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。