OpenGL了解渲染原理

2021-03-13  本文已影响0人  皮皮侠_Coder

大纲

CPU与GPU的职责和区别

CPU

不是真正的并发,是时间片的快速切换

GPU

计算机渲染原理

计算机显示演变:

渲染系统:

显存:存储处理后的渲染数据或即将显示的渲染数据

视觉暂留:一秒16帧,就会认为是连贯的,60帧是高清画质

渲染流程

屏幕成像与卡顿

屏幕撕裂

img

如何防止屏幕撕裂?

什么是掉帧/卡顿?简单来说就是 屏幕重复显示同一帧数据的情况就是掉帧

如下图所示:当前屏幕显示的是A,显示控制器在收到垂直信号Vsync后,从帧缓存区获取渲染数据,由于CPU和GPU处理的B还没有准备好,帧缓存区的内容还是A,在帧缓存区拿到的还是A,所以最终,屏幕显示的仍然是A

img

View 与 CALayer 的关系

参考自作者Style_月月

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

UIView

CALayer

UIKit是iOS平台的渲染框架,APPKit是Mac OSX系统下的渲染框架,

由于iOS和Mac两个系统的界面布局并不是一致的,iOS是基于多点触控的交互方式,而Mac OSX是基于鼠标键盘的交互方式,且分别在对应的框架中做了布局的操作,所以并不需要layer载体去布局,且不用迎合任何布局方式。

【面试题】UIView和CALayer的关系

UIView和CALayer的渲染

界面触发的方式有两种

最终都会走到CoreAnimation中的CA::Transaction::commit()方法,从而来触发UIView和CALayer的渲染

这时,已经到了CoreAnimation的内部,即调用CA::Transaction::commit();来创建CATrasaction,然后进一步调用 CALayer drawInContext:()

回调CALayer的Delegate(UIView),问UIView没有需要画的内容,即回调到drawRect:方法

在drawRect:方法里可以通过CoreGraphics函数或UIKit中对CoreGraphics封装的方法进行画图操作

将绘制好的位图交由CALayer,由OpenGL ES 传送到GPU的帧缓冲区

等屏幕接收到垂直信号后,就读取帧缓冲区的数据,显示到屏幕上

iOS下的渲染框架

不论是CoreGraphics、CoreAnimation还是CoreImage,最终都是通过OpenGL ES或者OpenGL Metal驱动GPU进行干活渲染绘制

CoreAnimation渲染

img

CoreAnimation过程:

OpenGL

上一篇 下一篇

猜你喜欢

热点阅读