EdigE
← ЛЕНТА

Jet заставил ESP32-S3 рисовать 3D полями по 60 раз в секунду

Экран 480×320 в RGB565 содержит 307 200 байт. Шестьдесят полных обновлений в секунду потребовали бы 18.4 Мбайт/с только полезных пикселей, ещё до команд контроллера и пауз на шине. В демонстрации Jet дисплей ST7796 подключён по SPI на 80 МГц, поэтому узкое место видно буквально в проводах между MCU и панелью: процессор может быстро подготовить геометрию, но передать полный кадр уже трудно.

Jet — компактный fixed-function rasterizer на C++17 для ESP32, STM32 и других MCU. Библиотека получает framebuffer от приложения и заполняет его; драйвер дисплея, главный цикл и запуск DMA остаются снаружи. Внутри выбраны действия, хорошо совпадающие с устройством микроконтроллера: 16-битный RGB565 сразу подходит распространённым контроллерам панелей, преобразования и растеризация в горячем пути опираются на integer/fixed-point арифметику и таблицы. Опции Z-buffer, painter’s sorting, перспективной текстуры и буферов задаются при компиляции, поэтому отключённая подсистема не занимает код и RAM. В примерной конфигурации углы камеры по умолчанию могут храниться как float, так что называть весь проект полностью лишённым float было бы неверно.

Рендерер, который знает цену байту

Самый красивый приём здесь называется field buffer. Один буфер хранит, например, чётные строки, второй — нечётные; на очередном шаге рендерится один набор строк, тогда как предыдущий набор уже передаётся дисплею через DMA. Поле занимает 153 600 байт, вдвое меньше полного кадра. Зритель видит 60 обновлений полей в секунду, а каждая строка изображения принадлежит одному из двух соседних моментов сцены.

У такого кадра есть цена. Это не прогрессивные 480×320 при 60 Hz: быстрые контрастные границы и мелкие движущиеся детали могут выдать чересстрочную структуру. Режим half-width buffers способен ещё сильнее сократить объём рисуемых пикселей, после чего строки разворачиваются при выводе. Для интерфейса прибора, простого 3D-индикатора или ретро-сцены такой обмен пространственной детализации на RAM и пропускную способность может оказаться разумным.

Кадр собран из двух моментов

Разработчик Jet заявляет около 40 000 flat-shaded треугольников в секунду на ESP32-S3, а также сцены с более чем 650 видимыми после culling треугольниками при 60 обновлениях полей в секунду. Эти числа описывают конкретный лёгкий путь с залитыми треугольниками без lighting. Текстурирование добавляет работу на каждый пиксель, Z-buffer расходует память и bandwidth, а методика бенчмарка, частота чипа и настройки компилятора для цифры 40 000 не опубликованы. Независимого измерения пока нет.

Идея Jet полезна далеко за пределами игрушечной 3D-графики. Она заставляет проектировать вывод изображения как связку вычислений, SRAM, DMA и физического интерфейса дисплея. Здесь производительность появилась из точного бюджета: какие строки существуют в памяти сейчас, какие уже едут по SPI и какие эффекты действительно нужны сцене.