awtk/docs/framebuffer.md

66 lines
3.1 KiB
Markdown
Raw Normal View History

2020-10-10 16:36:11 +08:00
## FrameBuffer 的几种使用方式
2018-05-18 07:47:33 +08:00
2020-10-10 16:36:11 +08:00
### 一、单 framebuffer。
2018-05-18 07:47:33 +08:00
2020-10-10 16:36:11 +08:00
系统中只有一个 framebufferLCD 使用该 framebuffer 进行显示GUI 使用该 framebuffer 进行绘制。
2018-05-18 07:47:33 +08:00
![1](images/fb1.png)
#### 优点:
2020-10-10 16:36:11 +08:00
* 只有一个 framebuffer内存需求减半。
2018-05-18 07:47:33 +08:00
* 无需额外内存拷贝,而且只需画变化的部分,所以性能很高耗电低。
#### 缺点
2020-10-10 16:36:11 +08:00
* GUI 绘制的同时 LCD 在显示,这很容易出现屏幕闪烁。为了避免闪烁,可以在 GUI 绘制前禁用 LCD 同步数据(需等待 LCD 刷完后再禁用),等绘制完成时再启用 LCD 同步数据。我在 stm32f429igtx 上测试,发现确实不闪烁了,但是在窗口动画时,颜色有些不正常。不知是不是 LCD 频繁启用/禁用LCD 时钟来不及稳定导致的。
2018-05-18 07:47:33 +08:00
> 如果硬件能够解决动画颜色不正常的问题或者不需要动画,这种方式是最好的选择。
2020-10-10 16:36:11 +08:00
### 二、双 framebuffer一个 online 一个 offline轮流切换显示。
2018-05-18 07:47:33 +08:00
2020-10-10 16:36:11 +08:00
* 1.GUI 在 offline 的 framebuffer 上绘制。
* 2.LCD 显示 online 的 framebuffer。
* 3.GUI 绘制完成后,交换两个 framebufferonline 变 offlineoffline 变 online。
2018-05-18 07:47:33 +08:00
![2](images/fb2.png)
#### 优点:
2020-10-10 16:36:11 +08:00
* 无需内存拷贝,切换 LCD 的 framebuffer 地址即可。
2018-05-18 07:47:33 +08:00
#### 缺点
2020-10-10 16:36:11 +08:00
* GUI 每次都需要进行完整的绘制,不能只绘制变化的部分。
2018-05-18 07:47:33 +08:00
2020-10-10 16:36:11 +08:00
### 三、双 framebuffer一个固定 online 供 LCD 显示,一个固定 offline 供 GUI 绘制。
2018-05-18 07:47:33 +08:00
![3](images/fb3.png)
#### 优点:
2020-10-10 16:36:11 +08:00
* 只需绘制变化的部分,绘制完成后,把变化的部分从 offline 的 framebuffer 拷贝到 online 的 framebuffer 即可。
2018-05-18 07:47:33 +08:00
#### 缺点:
2020-10-10 16:36:11 +08:00
* 窗口动画时,可能整个屏幕都在变化,所以拷贝的量比较大。优化方法:对于平移的动画,可以让 GUI 直接往 online 的 framebuffer 上绘制,减少一次内存拷贝,而且不会出现闪烁。
2018-05-18 07:47:33 +08:00
2020-10-10 16:36:11 +08:00
### 四、三个 framebuffer一个 online 供 LCD 显示,一个 offline 供 GUI 绘制,一个为下一个要显示的 framebuffer。
2018-05-18 07:47:33 +08:00
2018-07-08 11:28:47 +08:00
![4](images/fb4.png)
2020-10-10 16:36:11 +08:00
第二种方式的双缓冲切换方法有一个重要的性能问题:因为并不是在任意时刻都可以切换切换缓冲区,而是只有在当前帧显示完成后才能切换,否则就会出现刚显示一部分就切换到下一帧的情况,这会导致闪烁。所以每次切换都需要等待显示完成,按每秒刷新 60 帧算,这需要等待 16ms 左右,如果绘制本身需要 16ms那帧率就只有 30FPS 了。如果使三个 framebuffer就不用等待切换完成了帧率一下可以到达 60FPS 了。
2018-07-08 11:28:47 +08:00
2020-10-10 16:36:11 +08:00
* 1.GUI 选取不是 online 和 next 的 framebuffer 作为 offline 的 framebuffer在 offline 的 framebuffer 上绘制。
* 2.GUI 绘制完成后,把 offline 设置为 next 作为即将显示的 framebuffer。
* 3.LCD 在显示完成中断里,将 next 设置为 online 的 framebuffer并将 next 设置为空闲。
2018-07-08 11:28:47 +08:00
#### 优点:
* 显示速度大幅提升。
#### 缺点:
* 多一些内存开销。
2020-10-10 16:36:11 +08:00
> 以上方式各有优缺点,请根据具体情况进行选择,建议使用最后两种方式。