屏幕卡顿 及 iOS中OpenGL渲染架构分析

2021-03-03  本文已影响0人  辉辉岁月

屏幕卡顿

屏幕卡顿是指图形图像的在显示时出现了撕裂(即图片错位显示)、掉帧(重复显示同一帧数据)等问题,导致用户能直观的从屏幕上看到的一种异常现象
为什么会出现这种情况呢?下面就来详细解说下屏幕卡顿

【高频面试题】屏幕卡顿的原因

主要有以下三种原因

接下来,详细解析下屏幕撕裂及掉帧问题

屏幕撕裂

如图所示,屏幕撕裂就类似于这样的情形

在讲屏幕撕裂之前,首先说说屏幕是如何成像的,主要的流程是什么

屏幕成像过程

请看下面这张图,详细说明了屏幕成像的一个流程

屏幕撕裂的原因

苹果官方的解决方案
苹果官方针对屏幕撕裂现象,目前一直采用的是 垂直同步+双缓存,该方案是强制要求同步,且是以掉帧为代价的。

以下是垂直同步+双缓存的一个图解过程,如有描述错误的地方,欢迎留言指出

掉帧

采用苹果的双缓冲区方案后,又会出现新的问题,掉帧。
什么是掉帧?简单来说就是 屏幕重复显示同一帧数据的情况就是掉帧

如图所示:当前屏幕显示的是A,在收到垂直信号后,CPU和GPU处理的B还没有准备好,此时,屏幕显示的仍然是A(图有误,第二个为GPU)

iOS中的渲染

在iOS中渲染的整体流程如下所示

iOS中渲染框架总结

主要由以下六种框架,表格中已经说明了,就不再详细解释了

View 与 CALayer 的关系

首先分别简单说下UIView和CALayer各自的作用

UIView

CALayer

【面试题】UIView和CALayer的关系

UIView和CALayer的渲染

下图可以说明view 和 layer之间是如何渲染的

CoreAnimation

在苹果官方的描述中,Render、Compose,and animate visual elements,CoreAnimationg中的动画只是一部分,它其实是一个复合引擎,主要的职责包括 渲染、构建和动画实现。

ios中CoreAnimation如图所示

苹果为什么要基于UIView和CALayer提供两个平行的层级关系(UIKit 和APPKit)?

CoreAnimation中的渲染流水线

CoreAnimation中渲染的流程如图所示

主要分为两部分:

CoreAnimation部分

GPU部分

OpenGL 渲染架构分析

OpenGL中的渲染架构如图所示

主要分为两个模块

架构分析

数据传递

从图上我们可以看出,客户端和服务器进行数据传递的通道有三种

通道名称 参数类型 可传入的着色器
Attributes 经常发生变动的数据 :纹理坐标 、光照法线、顶点坐标 、颜色数据 顶点着色器
Uniform 不经常发生变动的数据 顶点着色器、片元着色器
Texture Data 纹理 顶点着色器、片元着色器

Attributes

Uniform

Texture Data

上一篇 下一篇

猜你喜欢

热点阅读