Android渲染时间 太长,Android性能优化之渲染篇

1)基本概念

在一个典型的显示系統中,一般包括CPU、GPU、display三個部分, CPU负责計计算数据,把计算好数据交給GPU,GPU会对图形数据进行渲染,渲染好后放到buffer里存起來,然后display(有的文章也叫屏幕或者显示器)负责把buffer里的数据呈現到屏幕上。很多時候,我們可以把CPU、GPU放在一起说,那么就是包括2部分,CPU/GPU 和display(本文主要按后面这种分类來解释)。

tearing: 一个屏幕內的数据來自2个不同的帧,画面会出现撕裂感。

jank: 一个帧在屏幕上连续出現2次。

lag:从用户体验來说,就是点击下去到呈现效果之间存在延迟。

Refresh Rate:代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。

Frame Rate:代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。

2)Screen tearing问题如何解决

screen tearing

显示过程,简单的说就是CPU/GPU准备好数据,存入buffer,display去buffer里取数据,然后显示出來。如果只有一个buffer,那么这个buffer既被GPU写,也同時被display读,如果读的速度跟写的速度一样,那可以正常显示。如果读的比写的快(显示器刷新频率略快于CPU/GPU准备缓存的速度),那也沒什么问题。但是如果读的比写的慢的話,很可能有buffer里的数据沒有被读取,就被重写了,这样相当于一部分数据丟失了,这是不允许的。比如display在读取帧1的过程中(为了显示帧1),CPU/GPU把帧2写到了buffer里 ,而display并不知道此时buffer里已经是帧2了,那么就会出现display读的上半部分是帧1,下半部分是2的, 出現画面“割裂”,这就叫tearing。

double-buffer

tearing发生的原因是display读buffer时,buffer被修改,那么多一个buffer是不是能解決问题,是的,事实上目前所有的显示系統都是双缓存的,单缓存存在于30年前。

双缓冲技术,基本原理就是采用两块buffer。一块back buffer用于CPU/GPU后台绘制,另一块framebuffer则用于显示,当back buffer准备就绪后,它们才进行交换。不可否认,doublebuffering可以在很大程度上降低screen tearing错误,但是它是万能的吗?

一个需要考虑的问题是我们什么时候进行两个缓冲区的交换呢?假如是back buffer准备完成一帧数据以后就进行,那么如果此时屏幕还没有完整显示上一帧内容的话,肯定是会出问题的。看来只能是等到屏幕处理完一帧数据后,才可以执行这一操作了。

我们知道,一个典型的显示器有两个重要特性,行频和场频。行频(HorizontalScanningFrequency)又称为“水平扫描频率”,是屏幕每秒钟从左至右扫描的次数; 场频(Vertical Scanning Frequency)也称为“垂直扫描频率”,是每秒钟整个屏幕刷新的次数。由此也可以得出它们的关系:行频=场频*纵坐标分辨率。

当扫描完一个屏幕后,设备需要重新回到第一行以进入下一次的循环,此时有一段时间空隙,称为VerticalBlanking Interval(VBI)。大家应该能想到了,这个时间点就是我们进行缓冲区交换的最佳时间。因为此时屏幕没有在刷新,也就避免了交换过程中出现screentearing的状况。VSync(垂直同步)是VerticalSynchronization的简写,它利用VBI时期出现的vertical sync pulse来保证双缓冲在最佳时间点才进行交换。

总结

Screen Tearing出现的原因有两个:

1,单缓冲情况下,在display的时候draw(也就是所谓的On Display Draw)

2,双缓冲情况下,在display的时候swap buffer(Flip).

所以:

我们只要使用双缓冲做Flip(避免了On display Draw),并且做VSync同步,即每次等到VSync阶段再做swap,就可以完美解决Screen Tearing问题。

3)VSYNC的前生今世

VSYNC(Vertical Synchronization)是一个相当古老的概念,对于游戏玩家,它有一个更加大名鼎鼎的中文名字—-垂直同步。“垂直同步(vsync)”指的是显卡的输出帧数和屏幕的垂直刷新率相同,这完全是一个CRT显示器上的概念。其实无论是VSYNC还是垂直同步这个名字,因为LCD根本就没有垂直扫描的这种东西,因此这个名字本身已经没有意义。但是基于历史的原因,这个名称在图形图像领域被沿袭下来。在当下,垂直同步的含义我们可以理解为,使得显卡生成帧的速度和屏幕刷新的速度的保持一致。举例来说,如果屏幕的刷新率为60Hz,那么生成帧的速度就应该被固定在1/60 s。

Android中的VSYNC — 黄油计划

从Android 4.1开始,谷歌致力于解决Android系统中最饱受诟病的一个问题,滑动不如iOS流畅。因谷歌在4.1版本引入了一个重大的改进—Proje

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值