display_gif_sd: load GIF from SD into PSRAM once, play from memory (9.8 -> 15.4 fps)

Also enable a 16 KB LVGL stdio read cache (no measurable effect for the GIF).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
patriandClaude Opus 5.5 committed 2026-10-23 01:43:31 +02:00
1 parent 55e27b6572
commit 71d4bf7b58
2 files changed
+19 -7

No files matched your search

@@ -22,14 +22,26 @@ void display_animation() {
lv_mem_monitor(&mem_mon); lv_mem_monitor(&mem_mon);
printf("Free memory: %d bytes\n", mem_mon.free_size); printf("Free memory: %d bytes\n", mem_mon.free_size);
lv_fs_file_t file; // Load the whole GIF from the SD card into PSRAM once and play it from memory:
if (lv_fs_open(&file, "A:wallpaper.gif", LV_FS_MODE_RD) == LV_FS_RES_OK) { // no SD access while playing (faster, and kinder to flaky cards)
lv_fs_close(&file); // File exists, proceed with loading static lv_image_dsc_t gif_dsc;
lv_gif_set_src(img, "A:wallpaper.gif"); File f = SD_MMC.open("/wallpaper.gif");
Serial.println("GIF Loaded Successfully"); size_t size = f ? f.size() : 0;
uint8_t* data = size ? (uint8_t*)ps_malloc(size) : NULL;
if (data && f.read(data, size) == size) {
gif_dsc.header.magic = LV_IMAGE_HEADER_MAGIC;
gif_dsc.header.cf = LV_COLOR_FORMAT_RAW;
gif_dsc.header.w = data[6] | (data[7] << 8); // GIF logical screen size
gif_dsc.header.h = data[8] | (data[9] << 8);
gif_dsc.data_size = size;
gif_dsc.data = data;
lv_gif_set_src(img, &gif_dsc);
Serial.printf("GIF loaded into PSRAM: %u bytes, %u x %u\n", size, gif_dsc.header.w, gif_dsc.header.h);
} else { } else {
Serial.println("Failed to Load GIF: File not found or inaccessible"); Serial.println("Failed to load /wallpaper.gif from the SD card");
free(data);
} }
if (f) f.close();
Serial.print("Available Heap after: "); Serial.print("Available Heap after: ");
Serial.println(esp_get_free_heap_size()); Serial.println(esp_get_free_heap_size());
+1 -1
View File
@@ -1967,7 +1967,7 @@
#define LV_FS_STDIO_PATH "/sdcard/" #define LV_FS_STDIO_PATH "/sdcard/"
/** Read cache size in bytes for stdio (0 = disabled) */ /** Read cache size in bytes for stdio (0 = disabled) */
#define LV_FS_STDIO_CACHE_SIZE 0 #define LV_FS_STDIO_CACHE_SIZE 16384 /* JC3636W518: fewer small SD reads (GIF decoding) */
#endif /*LV_USE_FS_STDIO*/ #endif /*LV_USE_FS_STDIO*/