From 08daed936e9063eee5b23d739ee2cf14cc3b0f7e Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Mon, 2 Feb 2026 21:26:21 +0800 Subject: [PATCH] feat: Implement double buffering in LVGLHandler for improved display performance --- main/display/lvgl_handler.cpp | 24 +++++++++++++++++++++--- main/display/lvgl_handler.h | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/main/display/lvgl_handler.cpp b/main/display/lvgl_handler.cpp index f293c51..bdb4ad0 100644 --- a/main/display/lvgl_handler.cpp +++ b/main/display/lvgl_handler.cpp @@ -26,6 +26,10 @@ LVGLHandler::~LVGLHandler() { lv_draw_buf_destroy(lvgl_draw_buf_); lvgl_draw_buf_ = nullptr; } + if (lvgl_draw_buf_2_ != nullptr) { + lv_draw_buf_destroy(lvgl_draw_buf_2_); + lvgl_draw_buf_2_ = nullptr; + } } esp_err_t LVGLHandler::initLVGL(EventGroupHandle_t system_event_group) { @@ -217,17 +221,31 @@ esp_err_t LVGLHandler::initLVGLDisplay_() { return ESP_FAIL; } - // Create a draw buffer covering the entire display + // Create two draw buffers for double buffering to improve performance lvgl_draw_buf_ = lv_draw_buf_create(DISPLAY_WIDTH, DISPLAY_HEIGHT, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); if (lvgl_draw_buf_ == nullptr) { - ESP_LOGE(TAG, "Failed to create LVGL draw buffer"); + ESP_LOGE(TAG, "Failed to create LVGL draw buffer 1"); lv_display_delete(lvgl_display_); lvgl_display_ = nullptr; lvgl_port_unlock(); return ESP_FAIL; } - lv_display_set_draw_buffers(lvgl_display_, lvgl_draw_buf_, nullptr); + + lvgl_draw_buf_2_ = lv_draw_buf_create(DISPLAY_WIDTH, DISPLAY_HEIGHT, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); + if (lvgl_draw_buf_2_ == nullptr) { + ESP_LOGE(TAG, "Failed to create LVGL draw buffer 2"); + lv_draw_buf_destroy(lvgl_draw_buf_); + lvgl_draw_buf_ = nullptr; + lv_display_delete(lvgl_display_); + lvgl_display_ = nullptr; + lvgl_port_unlock(); + return ESP_FAIL; + } + + // Set both buffers for double buffering + lv_display_set_draw_buffers(lvgl_display_, lvgl_draw_buf_, lvgl_draw_buf_2_); lv_display_set_render_mode(lvgl_display_, LV_DISPLAY_RENDER_MODE); + // // Configure LVGL display lv_display_set_color_format(lvgl_display_, LV_COLOR_FORMAT_I1); diff --git a/main/display/lvgl_handler.h b/main/display/lvgl_handler.h index 12e3d9d..95d00e2 100644 --- a/main/display/lvgl_handler.h +++ b/main/display/lvgl_handler.h @@ -31,4 +31,5 @@ private: lv_display_t* lvgl_display_ = nullptr; lv_indev_t* lvgl_touch_indev_ = nullptr; lv_draw_buf_t* lvgl_draw_buf_ = nullptr; + lv_draw_buf_t* lvgl_draw_buf_2_ = nullptr; };