CPU和GPU芯片的区别
CPU:全称Centrel Processing Unit,它是现代计算机的系统的运算核心和控制核心; GPU:全称Graphics Processing Unit,它是进行绘图运算的微处理器,是连接计算机与显示终端的纽带。
计算机渲染原理
随机扫描显示
图形是什么样的,就扫描显示那些像素点,例如
使用随机扫描显示器将图中这个绿色的正方形显示在屏幕中,则光束就沿着正方形的边扫描一圈,把对应象素点显示到屏幕上就可以了。图形越复杂,随机扫描显示需要的时间就越久。
光栅扫描显示
不管理图形是什么样的,每次扫描的时候都扫描整个屏幕,例如
使用光栅扫描显示显示图中的圆形,光束会从上到下,从左到右依次扫描屏幕,把圆形显示到屏幕上。光栅扫描显示的时间与图形是否复杂无关。
随机扫描显示是以前用的,现在都用光栅扫描显示。
光栅扫描显示原理
- 1.将图片从系统主存中取出;
- 2.CPU将图片进行解码;
- 3.将解码后的图片copy到帧缓存区;
- 4.GPU将解码后的图片显示到显示器上。
屏幕卡顿出现的原因
- 1.GPU去帧缓存区读取图片;
- 2.显示控制器将读取的帧缓存区信息,也就是我们的位图进行数模转换(数模转换就是将数字信号转换成模拟信息);
- 3.光栅扫描显示通过逐行扫描将图片显示到显示器上。
以上的流程会一直持续并快速的进行,当光栅扫描从缓存区读取数显示到显示器上时,如果一开始读取的是A图片,当扫描显示到中间的位置是,GPU将帧缓存区的数据进行了更新,此时帧缓存区的数据变成了B图片,那接下来继续扫描缓存区的图片显示到屏幕上的时间,读取的就是B图片,从而出现了一个屏幕上出现两个图片的现象,也就是上图出现的屏幕撕裂现象.
如何解决屏幕卡顿问题
苹果在解决屏幕卡顿问题上执行了两个策略
1.垂直同步
垂直同步其实就是在光栅扫描显示图片的时候,在帧缓存区加了一把锁,在读取帧缓存区数据时,不允许再对这块帧缓存区进行数据的写入。这样就保证了每次显示在屏幕上的图片都是同一张图片的数据了。
2.双缓存区
使用垂直同步对帧缓存区加了锁以后,屏幕上的显示的图片虽然不会再出现撕裂的情况了,但如果在光栅扫描垂直同显示图片的过程中,GPU读取到了新的图片的数据,由于垂直同步对帧缓存区进行了加锁,新来的图片数据就无法存到帧缓存区中,就会导致数据的丢失,那怎么办呢?于是就有了双缓存区,我们假设两个缓存区分别叫A,B。当光栅扫描显示A缓存区的图片时,GPU新读取的图片就存到B中,当B显示时,GPU新读取的图片就存到A中...,这样就解决了屏幕卡顿的问题。
三缓存区
通过垂直同步和双缓存区我们解决也屏幕撕列的问题,也保证了数据不会丢失,那我们思考一下,还会有别的问题出现嘛?答案是肯定的。 当显示器在显示完A图片时,如果B图片还没有被GPU加载到帧缓存区,那就接收不到垂直同步的信号去加载B图片,这时候就会出现两次都显示同一张图片的现象,这就是掉帧。掉帧与CPU和GPU的处理速度有关,是不可避免的,不过我们可以优化一下,减少掉帧的机率。那怎么优化呢?答案是三缓存区,再开辟一个缓存区C,这时候我们就有了A、B、C三个缓存区,当显示A的时候,GPU会加载图片到B,C;显示完B后,GPU又将新的图片加载到A;显示C的显示,GPU又将新的图片加载到A,以此类推,这样就可以保证屏幕一直有新的图片显示,从而降低了出现掉帧的机率。
总结
什么情况下会出现屏幕卡顿呢?
- 1.CPU/GPU处理速度太慢,加载图片到帧缓存区的时间过长,导致掉帧,从而卡顿;
- 2.使用垂直同步和双缓存区策略解决屏幕撕裂问题,以掉帧作为代价,导致卡顿;
- 3.三缓存区合理使用CPU/GPU减少掉帧次数,但依然可能出现掉帧,导致卡顿。