优化上面emwin demo,增加双缓存
时间: 2023-06-28 17:07:20 浏览: 99
要优化emWin的双缓存,需要使用双缓存技术来提高GUI的性能和流畅度。以下是实现双缓存的步骤:
1. 首先,需要一个双缓存缓冲区来存储GUI绘制的像素数据。这个缓冲区可以是内存中的数组或者LCD控制器中的显存。
2. 在绘制GUI之前,需要将当前的绘图设备(Device Context)切换到双缓存缓冲区。这可以通过调用GUI_SelectLCD()函数来实现。
3. 绘制完成后,需要切换回原来的绘图设备。这可以通过调用GUI_SelectLCD()函数并传递原来的设备句柄来实现。
4. 在绘制完成后,需要将双缓存缓冲区的数据复制到LCD控制器的显存中,从而将绘制结果显示在屏幕上。这可以通过调用LCD_CopyBuffer()函数来实现。
下面是一个示例代码,用于实现双缓存的EMWin Demo:
```c
#include "GUI.h"
#include "GUIDRV_Lin.h"
#define XSIZE_PHYS 480
#define YSIZE_PHYS 272
// 双缓存缓冲区
static U32 _aBuffer[XSIZE_PHYS * YSIZE_PHYS];
// 原始设备句柄
static GUI_DEVICE * _pOldDevice;
// 初始化EMWin
void GUI_Init(void) {
// 初始化GUI
GUI_Init();
// 设置LCD控制器驱动程序
GUIDRV_Lin_SetFuncDriver(&GUIDRV_Lin_OY_272x480);
// 设置显示区域
GUI_SetDisplayArea(0, 0, XSIZE_PHYS - 1, YSIZE_PHYS - 1);
// 设置颜色模式
GUI_SetColorConv(GUI_COLOR_CONV_8888);
// 设置双缓存缓冲区
GUI_SelectLCD(_aBuffer);
// 绘制背景
GUI_Clear(GUI_WHITE);
// 切换回原始设备
_pOldDevice = GUI_SelectLCD(GUI_DEVICE_CreateAndLink(GUIDRV_LIN_16, GUICC_565, 0, 0));
}
// 显示
void GUI_Update(void) {
// 将双缓存缓冲区的数据复制到LCD控制器显存中
LCD_CopyBuffer(_aBuffer, sizeof(_aBuffer));
// 切换回原始设备
GUI_SelectLCD(_pOldDevice);
}
// 绘制
void MainTask(void) {
// 初始化EMWin
GUI_Init();
while (1) {
// 绘制代码
// ...
// 显示
GUI_Update();
}
}
```
在这个示例代码中,我们使用_aBuffer数组作为双缓存缓冲区,并将其传递给GUI_SelectLCD()函数。在绘制完成后,我们将双缓存缓冲区的数据复制到LCD控制器的显存中,并切换回原始绘图设备。
使用双缓存可以避免GUI绘制时的闪烁和卡顿问题,提高GUI的性能和流畅度。