Android UI and the GPU

更多关于Android渲染性能请点击这里

渲染操作通常依赖于两个核心组件:CPU与GPU。

  • CPU负责包括Measure,Layout,Record,Execute的计算操作
  • GPU负责Rasterization(栅格化)操作。

CPU通常存在的问题的原因是存在非必需的视图组件,它不仅仅会带来重复的计算操作,而且还会占用额外的GPU资源。

那么Android是如何渲染

Activity是如何显示到屏幕上的,也就是说XML布局文件是如何转换成用户可见的像素图像

Resterization

从核心上来说,是通过光栅化过程实现。Resterization栅格化是将一个高级对象Button,Shape,Path,String,Bitmap等转换成纹理像素,拆分到不同的像素上进行显示

光栅化是一个非常耗时的过程,因此,有一个专门的硬件(图形处理器)GPU,专门为加速光栅化过程而设计,在上世纪90年代被引入主流计算机。
GPU本身设计要求使用一套特别的基元,主要是多边形、纹理也就是所谓的图像。CPU要在GPU进行屏幕绘制之前将这些基元送至GPU,这一过程在Android中使用Open GL ES来实现。

当你要绘制图像时,CPU负责把UI组件计算成Polygons,Texture纹理,然后交给GPU进行栅格化渲染。

每次计算和从CPU转移到GPU是一件很麻烦的事情,要优化性能,就需要减少对象转化的时间,也要减少将对象上传至GPU的时间。

OpenGL ES API

OpenGL ES API 允许上传内容到GPU,可以把那些需要渲染的纹理Hold在GPU Memory里面,在下次需要渲染的时候直接进行操作。所以如果你更新了GPU所hold住的纹理内容,那么之前保存的状态就丢失了。

比如你想要画一个按钮,只需要参照之前已经存在于GPU的纹理,告诉OpenGL怎么绘制就可以了,一般规则是这样的,尽可能多的存入数据,而且越快越好,然后留在那里,尽可能长时间不去动它。

Android主题资源

在Android里面那些由主题所提供的资源,例如Bitmaps,Drawables都是一起打包到统一的Texture纹理当中,然后再传递到GPU里面,这意味着每次你需要使用这些资源的时候,都是直接从纹理里面进行获取渲染的。

不同的组件转化过程

随着UI组件的越来越丰富,有了更多演变的形态

  • 显示图片的时候,需要先经过CPU的计算加载到内存中,然后传递给GPU进行渲染。
  • 特殊的Shape,Path,意味着我们需要在CPU中创造一连串的多边形,然后再GPU上创建出一个形状类似的伪装纹理
  • 文字的显示更加复杂,字形先经过CPU光栅化成纹理,然后再交给GPU进行渲染,然后返回,字符串中的每一个字符都需要这样在GPU Memory中绘制代表这些字形的矩形
  • 动画会让这一切更加复杂,由于改变了图形部分,每一帧都要进行GPU资源上传,一遍又一遍

Android的diff更新

Android 不会将整个应用的每一帧都重新绘制,Android会更新并绘制屏幕范围内的已经修改过的内容
Android为了更好地光栅化处理CPU的各种转化和上传

16ms

为了实现流畅、满足用户体验,我们需要在每一帧16ms以内处理完所有的CPU与GPU计算,绘制,渲染等等操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值