mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
3.7 KiB
3.7 KiB
Сценарии использования display engine
В движке используется явный контракт рисования:
display_begin_paint_try()илиdisplay_begin_paint_blocking()открывает кадр и даёт буфер.display_end_paint()закрывает кадр и передаёт его в вывод (в SAFE+2 может отложить на один кадр, если DMA занят).
Главное правило: каждый успешный begin должен завершаться display_end_paint().
1. Обновление 50 Гц без разрывов (рекомендуется)
Что получить:
- Тик 50 Гц от таймера.
- Если экран занят, кадр пропускается.
- Без разрывов и без блокировки основного цикла.
Конфигурация:
mode = DISPLAY_MODE_SAFEbuffer_count = 1или2
Последовательность:
display_init(&cfg)- В
mainна каждом тике:buf = display_begin_paint_try()- если
buf == NULL-> пропуск тика - рисование
display_end_paint()
2. Простой блокирующий цикл
Что получить:
- Максимально короткий код без проверок
NULL.
Конфигурация:
mode = DISPLAY_MODE_SAFE- обычно
buffer_count = 1
Последовательность:
display_init(&cfg)- В цикле:
buf = display_begin_paint_blocking()- рисование
display_end_paint()
Минус:
- Поток может ждать буфер и временно не выполнять другую работу.
3. Неблокирующая анимация/UI
Что получить:
- Главный цикл всегда остаётся отзывчивым.
- Пока DMA выводит буфер A, можно рисовать буфер B без блокировки.
Конфигурация:
mode = DISPLAY_MODE_SAFE- лучше
buffer_count = 2
Последовательность:
display_init(&cfg)- В цикле:
buf = display_begin_paint_try()- если
buf == NULL-> делаем другую логику и идём дальше - рисование
display_end_paint()
4. RAW-режим (низкоуровневый ручной контроль)
Что получить:
- Полный ручной контроль swap в RAW-режиме.
Конфигурация:
mode = DISPLAY_MODE_RAWbuffer_count = 2
Последовательность:
buf = display_begin_paint_try()- если
buf == NULL-> пропуск итерации - рисование
display_swap_buffers()display_end_paint()
Примечание:
- В RAW swap остаётся ручным, а отправка кадра выполняется через
display_end_paint().
5. Что нельзя делать
- Делать второй
begin, не закрыв первыйdisplay_end_paint(). - Забывать
display_end_paint()после успешногоbegin. - Вызывать
display_submit()вручную внутри открытой paint-секции.
6. Шаблон 50 Гц
static volatile bool frame_tick_due = false;
static bool frame_timer_cb(repeating_timer_t* t) {
(void)t;
frame_tick_due = true;
return true;
}
while (1) {
if (!frame_tick_due) {
__asm volatile ("wfi");
continue;
}
frame_tick_due = false;
uint16_t* buf = display_begin_paint_try();
if (!buf) {
continue;
}
// draw(buf)
bool ok = display_end_paint();
hard_assert(ok);
}