Skip to main content

Common Issues and Troubleshooting

Frame rate drops after opening and returning from an app

Symptoms

When scrolling the app list to test frame rate, the FPS after opening a JS app and returning to the list is noticeably lower than testing directly after system boot. The FPS drop scales with the number of suspended apps (~5-10 FPS per suspended app).

Cause

LV_USE_ASSERT_MEM_INTEGRITY is set to 1 in lv_conf.h.

When enabled, LVGL calls lv_mem_test() after every timer callback (lv_timer.c), object-tree operation (lv_obj_tree.c), and draw operation (lv_draw_rect.c, lv_draw_label.c). lv_mem_test() walks the entire TLSF memory pool checking every block header. With the built-in TLSF allocator (LV_STDLIB_BUILTIN), each suspended app (Recents) adds more allocated blocks → integrity check time grows linearly → FPS drops linearly.

This can be confirmed with macOS Instruments (Time Profiler): samples will show lv_tlsf_check / integrity_walker / block_is_free dominating the frame budget.

Solution

Set LV_USE_ASSERT_MEM_INTEGRITY to 0 in lv_conf.h:

#define LV_USE_ASSERT_MEM_INTEGRITY 0

This option is useful for catching heap corruption during development, but must be disabled when doing any frame-rate, scrolling, or animation performance testing. The other asserts (LV_USE_ASSERT_NULL, LV_USE_ASSERT_MALLOC) are O(1) checks and safe to leave on.