awtk/docs/framebuffer.md

69 lines
3.0 KiB
Markdown
Raw Normal View History

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