关于system/bin/mediaserver占用CPU高的 解决方法

啰嗦一堆

最近接触到相机功能,需要拿到相机的预览数据做后续处理,刚开始使用没发现什么大问题,后来才发现midiaserver居然占了我25%的CPU,这还得了,于是赶紧百度。。。卧槽,,,,没有,谷歌呢。。。。还是没有,基本上都是拿源码来说一大堆,表示我这个水平的人还没有达到那种高度,没办法只能自己调了,,,

经过我的测试发现,该服务的占用率主要由两个地方引起:

1.分辨率

         myParam.setPictureSize(pictureSize.width, pictureSize.height);
         // 设置预浏尺寸
         myParam.setPreviewSize(previewSize.width, previewSize.height);

    通过我测试时发现,meaiaServer占用率高主要原因是由分辨率引起的,在使用之前,最好是先获取一下自己手机的屏幕分辨率,然后适当的调整,计算出摄像头支持的最优分辨率。我当时的测试机是1280*800但是,我使用了1920*1080的分辨率来设置了预览画面的宽高,具体原因没有了解,但是降低了分辨率后占用率确实下去了。

2.使用setPreviewCallbackWithBuffer

         正常的话我推荐使用这个回调来获取数据,比起setPreviewCallback来说,有几大优势

           1.可以不用频繁的开辟一个新的buffer来为GC增加压力

          2.有自己的回收缓存,所以不用自己再思考怎么来缓存,自接调用就好了,能达到优化性能的目的。

然后,再来讲一下,很多时候其实我们都使用的这个回调,只要注意下这儿就行了

mCamera.addCallbackBuffer(new byte[((previewWidth * previewHeight) * ImageFormat.getBitsPerPixel(ImageFormat.NV21)) / 8]);

在计算的byte[]长度的时候,如果字节数组长度过大,会使CPU占用率提高的,最好是算一下当前帧所需要的字节长度,再设置会好很多,使用width * height *3 应该就是标准的字节长度,具体自己测试一下吧。

总结:

 说了一大堆废话,总结一下,目前我了解的就两原因:

1.分辨率,要求不高就调低点吧

2.使用CallbackBuffer时,addCallbackBuffer的长度不要超过原始数据太大,也会导致cpu占用增大。

以上只是我个人的一些理解,说错的地方欢迎指正,也希望能有大佬能补充补充。另外有个自定义的相机拍照预览的小Demo,有需要的同学可以找我。

谢谢

你可能感兴趣的:(Android,开发记录)