Android 性能优化之旋转屏幕优化
2017-05-02 17:52
531 查看
我的博客原文地址
首先分析Log,找出可以优化的点:
通过Log发现,转屏是要等
根据
然后看效果:
发现这个时候瓶颈已经不再
接下来看看
通过 TraceView 工具发现在
只在
第三步的任务就是优化
问题背景
在桌面转屏发现响应不够迅速,对比其他产品有很大的提升空间,针对此问题进行了一些分析和优化。问题分析和解决方法
首先简单介绍一下旋转屏幕的流程,首先各个界面要进行重绘,在重绘过程中要进行冻屏,只有所有Window都进行绘制完成了才进行转屏,因此这里面就有个木桶效应,转屏的时间取决于重绘最慢的那个。
首先分析Log,找出可以优化的点:
adb shell dumpsys window -d enable 10 adb logcat -v threadtime -s WindowManager | grep -E "Screen frozen for|Dismissing screen|Orientation start waiting for draw|Orientation not waiting for draw"
adb shell dumpsys window -d enable 10是使能
DEBUG_ORIENTATION,开启打印转屏相关的Log。
WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{249e41f u0 StatusBar}, surface Surface(name=StatusBar) WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{731dc6a u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher) WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{b22eda5 u0 com.android.systemui.ImageWallpaper}, surface Surface(name=com.android.systemui.ImageWallpaper) WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{731dc6a u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher) WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{731dc6a u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher) WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{94517ed u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher) WindowManager: Orientation not waiting for draw in Window{94517ed u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher) WindowManager: Orientation not waiting for draw in Window{b22eda5 u0 com.android.systemui.ImageWallpaper}, surface Surface(name=com.android.systemui.ImageWallpaper) WindowManager: Orientation not waiting for draw in Window{249e41f u0 StatusBar}, surface Surface(name=StatusBar) WindowManager: Screen frozen for +968ms due to Window{249e41f u0 StatusBar} WindowManager: **** Dismissing screen rotation animation
通过Log发现,转屏是要等
StatusBar,
Launcher和
ImageWallpaper绘制完才会开始的。
根据
Screen frozen for +968ms due to Window{249e41f u0 StatusBar}发现目前的瓶颈在状态栏这里,首先分析一下状态栏的代码,可以借助于 TraceView 工具迅速定位到耗时较多方法的位置,发现在
NotificationPanelView的
onConfigurationChanged函数中有一项耗时的操作,先进行这部分优化。
然后看效果:
WindowManager: Screen frozen for +747ms due to Window{3aaa434 u0 com.android.launcher/com.android.launcher.Launcher}
发现这个时候瓶颈已经不再
StatusBar这里了,接下面再优化
Launcher就可以。
接下来看看
ImageWallpaper是不是有优化的余地呢?
通过 TraceView 工具发现在
ImageWallpaper.drawFrame()方法中,每次旋转屏幕都会在
updateWallpaperLocked()中调用
mWallpaperManager.getBitmap()进行解码图片,这个也是没有必要的,只初始化一次就可以了,可以进行如下的修改:
// Load bitmap if it is not yet loaded or if it was loaded at a different size if (mBackground == null/* || surfaceDimensionsChanged*/) {
只在
mBackground为
null是加在壁纸图片。
第三步的任务就是优化
Launcher了,此处的优化点各不相同,而且较多,就不一一介绍了。
相关文章推荐
- Android 重力感应和屏幕旋转关系
- Android 屏幕旋转时保存状态
- Android数据库SQLite性能优化技巧
- 让android程序根据重力感应旋转屏幕(支持4个方向旋转)
- [Android]ListView性能优化之视图缓存
- android 重力感应和屏幕旋转关系
- 15—关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记
- [Android]ListView性能优化之视图缓存(续) 推荐
- [Android]ListView性能优化之视图缓存(续)
- 关于ToolRotate——Android屏幕方向旋转的根源
- android 屏幕旋转v
- 【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!
- 【Android2D游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!
- android 屏幕旋转 重新调用onCreate的解决方法
- Android 屏幕旋转时保存状态
- Android代码性能优化技巧
- 【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!
- Android中通过按键旋转屏幕
- android屏幕旋转在framework中的修改。
- Android ListView 性能优化-----(异步加载图片资源)