性能优化的目的不是优化项目,而是优化编码习惯。--jett
CPU 与GPU工作流程
image.pngimage1.png
image2.png
image3.png
image4.png
image5.pngVSYNC(vertical synchorinzed) 垂直同步信号
VR 视频看上去头晕是因为帧数不够
image6.pngCPU处理信息--->GPU绘制信息,这两个过程在周期中无论那个过程未完成,都会丢帧 如image5 中的“绿色方块儿2、3、4”
image.png
image7.png
查看方法
开发者选项->Profile GPU rendering/调试GPU过度绘制
配置文件 GPU 渲染速度
配置文件 GPU 渲染工具作为滚动直方图显示渲染 UI 窗口的帧相对于每帧 16 毫秒的基准需要多少时间的可视化表示。
在功能较低的 GPU 上,可用填充速率(GPU 填充帧缓冲区的速度)可能相当低。随着绘制帧所需的像素数增加,GPU 可能需要更长时间来处理新命令,并要求系统的其余部分等待,直到它能够赶上。分析工具可帮助您识别 GPU 何时在绘制像素时不堪重负或因大量透支而不堪重负。
注意:此分析工具不能与使用 NDK 的应用使用。这是因为每当 OpenGL 采用全屏上下文时,系统都会将框架消息推送到后台。在这种情况下,您可能会发现 GPU 制造商提供的分析工具很有帮助。
启用探查器
开始之前,请确保使用运行 Android 4.1 (API 16) 或更高版本的设备,并启用开发人员选项。若要在使用应用时开始分析设备 GPU 渲染,请按照以下步骤操作:
- 在设备上,转到"设置"并点按"开发人员选项"。
- 在"监视"部分中,选择"配置文件 GPU 渲染"。
- 在"配置文件 GPU 渲染"对话框中,选择"在屏幕上"作为条形图,以覆盖设备屏幕上的图形。
- 打开要分析的应用。
检查输出
在图 1 所示的配置文件 GPU 渲染图的放大图像中,您可以看到在 Android 6.0(API 级别 23)上显示的彩色部分。
image图1。放大的配置文件 GPU 渲染图。
以下是有关输出的一些需要注意的事项:
- 对于每个可见的应用程序,该工具将显示一个图形。
- 沿水平轴的每个垂直条表示一个帧,每个垂直条的高度表示帧渲染所需的时间(以毫秒为单位)。
- 水平绿线表示 16 毫秒。要达到每秒 60 帧,每个帧的垂直条需要保持在这条线以下。当条形超出此行时,动画中可能会暂停。
- 该工具通过使相应的条形更宽且透明度更低来突出显示超过 16 毫秒阈值的帧。
- 每个条形都有映射到渲染管道中阶段的颜色组件。组件的数量因设备的 API 级别而异。
下表提供了使用运行 Android 6.0 及更高版本的设备时探查器输出中垂直条的每个段的说明。
表1.Android 6.0 及更高版本的组件条
4.0(API 级别 14)和 5.0(API 级别 21)之间的 Android 版本具有蓝色、紫色、红色和橙色段。4.0 以下的 Android 版本只有蓝色、红色和橙色组件。下表显示了 Android 4.0 和 5.0 中的组件栏。
表2.**Android 4.0 和 5.0 中的组件条
有关如何解释分析工具提供的信息的信息,请阅读使用配置文件GPU 渲染进行分析。
注:虽然此工具名为配置文件 GPU 渲染,但所有受监视的进程实际上都发生在 CPU 中。渲染通过向 GPU 提交命令而发生,GPU 以异步方式呈现屏幕。在某些情况下,GPU 可能有太多的工作要做,并且 CPU 必须等待才能提交新命令。发生这种情况时,您将在橙色和红色条形中看到峰值,并且命令提交将阻止,直到在 GPU 命令队列上创建更多空间。
image9.png过度绘制优化(主要是减少GPU工作量)
1.减少背景重复
注意主题中的设置
去掉单个Activity主题设置属性,可以在*setContentView*之前
getWindows().setBackgroundDrawable(null)
去掉所有activity中主题设置中的属性 直接在 styles.xml中设置
<item name="ansroid:windowBackground">@null<item>
非业务需求,不要设置背景
*透明颜色CPU会进行计算,但GPU不会绘制
2.使用裁剪减少控件之间的重复部分
canvas.clipRect((float)c.x,0f,(float)(mDroidCards.get(i+1).x),(float)c.height);
Android 7.0之后系统做出的优化--invalidate()不再执行测量和布局工作
布局的优化 (主要减少CPU工作量)
常用工具
Android/sdk/tools/bin/ui automator viewer.bat
Android\sdk\tools\monitor.bat
Device Monitor窗口中Hierarchy view
三个点也是代表着View的Measure, Layout和Draw。
- 绿: 表示该View的此项性能比该View Tree中超过50%的View都要快;例如,代表Measure的是绿点,意味着这个视图的测量时间快于树中的视图对象的50%。
- 黄: 表示该View的此项性能比该View Tree中超过50%的View都要慢;
- 红: 表示该View的此项性能是View Tree中最慢的;。
注意点:
1.能在一个平面显示的内容,尽量只用一个容器
2.尽可能把相同的容器合并merge
3.能复用的代码,用include处理,可以减少GPU重复工作
网友评论