过度重绘

主要参考:http://ju.outofmemory.cn/entry/129435 和http://www.cnblogs.com/tianzhijiexian/p/4277732.html

过渡绘制概念

GPU过渡绘制的概念:GPU过度绘制指的是在屏幕一个像素上绘制多次(超过一次),比如一个TextView后有背景,那么显示文本的像素至少绘了两次,一次是背景,一次是文本。GPU过度绘制或多或少对性能有些影响,设备的内存带宽是有限的,当过度绘制导致应用需要更多的带宽(超过了可用带宽)的时候性能就会降低。带宽的限制每个设备都可能是不一样的。

过渡绘制的原因

  1. 太多的View叠加
  2. 复杂的层级叠加
  3. 更长的inflation时间

过渡绘制和不合理的xml布局的影响

  1. 布局文件是一个xml文件,inflate布局文件其实就是解析xml,根据标签信息创建相应的布局对象并做关联。xml中的标签和属性设置越多,节点树的深度越深,在解析时要执行的判断逻辑、函数的嵌套和递归就越多,所以时间消耗越多;
  2. inflate操作只是布局影响的第一个环节,一个界面要显示出来,在requestLayout后还要执行一系列的measure、layout、draw的操作,每一步的执行时间都会受到布局本身的影响。而界面的最终显示是所有这些操作完成后才实现的,所以如果布局质量差,会增加每一步操作的时间成本,最终显示时间就会比较长。

过渡绘制的一些基本概念:

Android提供了三个工具来帮助辨别和解决重绘问题:Hierachy Viewer,Tracer for OpenGL和Show GPU overdraw。前两个可以在ADT工具或者独立的monitor工具中找到,最后一个是在开发者选项的一部分.

  1. GPU过渡绘制测试:对于过度绘制的测试主要通过人工进行测试,也是发现应用过渡绘制的首选途径 .通过打开开发者选项中的 显示GPU过度绘制(魅族手机:设置—辅助功能—开发人员工具—硬件加速渲染—调试GPU过渡绘制— 显示过渡绘制区域. (魅族手机需要打开开发者模式:需要在电话界面输入: ##6961## )) 来进行测试(PS:只有android4.2及以上的版本才具备此功能)
  2. 颜色标识: GPU过渡绘制从好到差:蓝-绿-淡红-红
    • 蓝色1x过度绘制
    • 绿色2x过度绘制
    • 淡红色3x过度绘制
    • 红色超过4x过度绘制
  3. 验收标准:
    • 控制过度绘制为2x
    • 不允许存在4x过度绘制
    • 不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)

从图中我们就可以看到,文字部分出现了绿色(因为和底部的蓝色叠加了,所以变成了黄绿色),在顶部开关部分出现了红色,也就是四层的过度绘制,这是需要避免的。但由于在屏幕上占的位置很小,所以可以酌情考虑。

避免过渡绘制的方法:

1. 在布局层次一样的情况下, 建议使用LinearLayout代替RelativeLayout, 因为LinearLayout性能要稍高一点.

2. 在完成相对较复杂的布局时,建议使用RelativeLayout,RelativeLayout可以简单实现LinearLayout嵌套才能实现的布局.

2. 将可复用的组件抽取出来并通过include标签使用;
3. 使用ViewStub标签来加载一些不常用的布局;
4. 动态地inflation view性能要比SetVisiblity性能要好.当然用VIewStub是最好的选择.
5. 使用merge标签减少布局的嵌套层次
6. 去掉多余的背景颜色

7. 对于有多层背景颜色的Layout来说,留最上面一层的颜色即可,其他底层的颜色都可以去掉
8. 对于使用Selector当背景的Layout(比如ListView的Item,会使用Selector来标记点击,选择等不同的状态),可以将normal状态的color设置为”@android:color/transparent”,来解决对应的问题

9. 内嵌使用包含layout_weight属性的LinearLayout会在绘制时花费昂贵的系统资源,因为每一个子组件都需要被测量两次。在使用ListView与GridView的时候,这个问题显的尤其重要,因为子组件会重复被创建.所以要尽量避免使用Layout_weight
10. 使得Layout宽而浅,而不是窄而深(在Hierarchy Viewer的Tree视图里面体现)


### 回答1: 在Winform中,要重绘表格控件,可以使用以下方法: 1. 首先,确定要重绘的表格控件,可以是DataGridView或ListView等任何支持表格展示的控件。 2. 创建一个继承自表格控件的自定义控件类,例如`CustomDataGridView`。 3. 在自定义控件类中,重写`OnPaint`方法。在方法中编写自定义的绘制逻辑,例如绘制行列的边框、绘制单元格的背景色等。 4. 在`OnPaint`方法中,可以使用`Graphics`类来进行绘制操作。可以使用`e.Graphics`获取当前绘图对象,并在该对象上进行绘画操作。 5. 在需要重绘表格的时候,调用自定义控件类的`Invalidate`方法,强制触发`OnPaint`方法进行重绘。 6. 如果需要在表格控件的事件中进行重绘,可以在事件处理程序中调用`Invalidate`方法。 例如,以下代码片段展示了一个简单的自定义DataGridView控件类: ```csharp public class CustomDataGridView : DataGridView { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 自定义绘制逻辑,例如绘制边框 Pen pen = new Pen(Color.Black); e.Graphics.DrawRectangle(pen, ClientRectangle); pen.Dispose(); } } ``` 然后,在使用表格控件的地方,可以使用自定义的控件类`CustomDataGridView`来代替原生的控件类,以实现重绘的效果。 需要注意的是,重绘表格控件增加系统资源的使用,并可能影响界面的响应速度,因此应该避免过度重绘操作。 ### 回答2: 在WinForms中,要重绘一个表格控件,可以按照以下步骤进行操作。 首先,需要创建一个继承自DataGridView的自定义控件。这个自定义控件将包含表格的所有定制逻辑。 然后,在自定义控件的构造函数中,可以设置表格的样式,如行高、列宽、表头等。 接着,可以重写OnPaint方法,以便在控件绘制时自定义绘制表格的内容。在OnPaint方法中,可以使用Graphics对象的方法绘制表格的背景、行、列、单元格内容等。 此外,还可以重写OnCellPainting方法,以便在每个单元格绘制时自定义绘制单元格的样式。在OnCellPainting方法中,可以使用Graphics对象的方法绘制单元格的边框、背景、内容等。 当需要更新表格的显示数据时,可以调用自定义控件的Refresh方法,强制重新绘制控件。在Refresh方法中,可以重新计算表格的行数、列数、内容等,然后调用自定义控件的Invalidate方法,使控件无效,从而触发重绘。 需要注意的是,在使用自定义控件时,需要将其添加到窗体或其他容器中,并设置好位置、大小等属性,才能正确显示和重绘表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值