vsync是垂直同步吗,vsync开启还是关闭

首页 > 实用技巧 > 作者:YD1662023-06-24 17:38:22

所谓的栅格化就是绘制那些Button,Shape,Path,String,Bitmap等组件最基础的操作。

它把那些组件拆分到不同的像素上进行显示,说的俗气一点,就是解决那些复杂的XML布局文件和标记语言,使之转化成用户能看懂的图像,但是这不是直接转换的,XML布局文件需要在CPU中首先转换为多边形或者纹理,然后再传递给GPU进行格栅化,对于栅格化,跟OpenGL有关,格栅化是一个特别费时的操作。

vsync是垂直同步吗,vsync开启还是关闭(5)

分析到这里,16毫秒的时间主要被两件事情所占用,

第一件:将UI对象转换为一系列多边形和纹理;

第二件:CPU传递处理数据到GPU。

所以很明显,我们要缩短这两部分的时间,也就是说需要尽量减少对象转换的次数,以及上传数据的次数,对否?

我们再看一图,这图简单说明CPU和GPU的职责工作,以及可能发生的问题和解决方案。

vsync是垂直同步吗,vsync开启还是关闭(6)

列名解释
PIPELINE管道
PROBLEM发生的问题
TOOLS用什么工具来解决
SOLUTION解决方案时什么

在CPU方面,最常见的性能问题是不必要的布局和失效,这些内容必须在视图层次结构中进行测量、清除并重新创建,引发这种问题通常有两个原因:

一是重建显示列表的次数太多,

二是花费太多时间作废视图层次并进行不必要的重绘。

这两个原因在更新显示列表或者其他缓存GPU资源时导致CPU工作过度。在GPU方面,最常见的问题是我们所说的过度绘制(overdraw),通常是在像素着色过程中,通过其他工具进行后期着色时浪费了GPU处理时间。下面我们对GPU和CPU产生的两大问题进行优化。

4、过度绘制(overdraw)检测

Overdraw(过度绘制)

描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。

在多层次的UI结构里面, 如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。

按照以下步骤打开Show GPU Overrdraw的选项:

设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制

vsync是垂直同步吗,vsync开启还是关闭(7)

蓝色淡绿淡红深红代表了4种不同程度的Overdraw情况,

我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

5、Overdraw 的处理方案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ListView
android:id="@ id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<ViewStub
android:id="@ id/network_error_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/empty_view" />
</RelativeLayout>

private void showNetError {
// not repeated infalte
if (networkErrorView != ) {
networkErrorView.setVisibility(View.VISIBLE);
return;
}

ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);
networkErrorView = stub.inflate;
Button networkSetting = (Button)networkErrorView.findViewById(R.id.network_setting);
Button refresh = (Button)findViewById(R.id.network_refresh);
}

private void showNormal {
if (networkErrorView != ) {
networkErrorView.setVisibility(View.GONE);
}
}

6、减少不必要的层次:巧用Hierarchy Viewer

Hierarchy Viewer接触过Android的人估计都用过,如果在真机上可以使用ViewServer这个第三方库:https://github.com/romainguy/ViewServer,配置步骤比较简单,主要分为如下三步:

第一步,在根build.gradle文件中加入

allprojects {
repositories {
jcenter
maven { url "https://jitpack.io" }
}
}

第二步,在Module的build.gradle文件中加入

dependencies {

...................................

compile 'com.github.romainguy:ViewServer:017c01cd512cac3ec054d9eee05fc48c5a9d2de'

}

第三步,加上访问网络权限,在Activity添加下列代码

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// Set content view, etc.
ViewServer.get(this).addWindow(this);
}

public void onDestroy {
super.onDestroy;
ViewServer.get(this).removeWindow(this);
}

public void onResume {
super.onResume;
ViewServer.get(this).setFocusedWindow(this);
}

它只能在root过的机器才能使用,可以帮我们减少View的层,在Hierarchy Viewer窗口中,所有的子View上面都有了3个圈圈(取色范围为红、黄、绿色),这三个圈圈分别代表measure 、layout、draw的速度,并且你也可以看到实际的运行的速度。

如果你发现某个View上的圈是红色,那么说明这个View相对其他的View,该操作运行最慢,注意只是相对别的View,并不是说就一定很慢。

布局常见问题与优化建议

参考链接:

http://www.cnblogs.com/krislight1105/p/5352517.html

http://www.csdn.net/article/2015-01-20/2823621-android-performance-patterns

今日问题:

文章里提到的几个优化点有注意过吗?

,
上一页12末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.