Screens/Screens you have to keep feeding/Frame buffer, PSRAM and DMA
Lesson 8 of 16 · in 3D and VR

Frame buffer, PSRAM and DMA

A frame buffer that fits in memory can still fail to reach the screen on time. Capacity and bandwidth are separate questions, and on an ESP32-S3 the route from PSRAM to the panel decides which one you hit.

Lonely BinaryUpdated 2026-10-014 min readNo board required

View it in VR

Lesson 8 of the Screens course opens in a VR headset, on a table in front of you, and a voice starts three seconds after you arrive. Type this short address into the browser on a headset such as Meta Quest or Apple Vision Pro, and press Enter VR. No headset? Press Start the lesson: the same lesson, full screen.

learn.lonelybinary.com/vr/screens/8

A 1024 × 600 RGB565 frame needs 1024 × 600 × 2 = 1,228,800 bytes, about 1.23 MB. That fits in PSRAM, and a static page looks fine, because nothing needs to move.

Capacity is not bandwidth

At 60 frames per second the active pixels alone need 73.7 MB/s. Over a 16-bit RGB bus that is about 36.9 MHz of active pixel clock, ignoring blanking. Full-screen animation makes the system supply changing pixels continuously, so the question becomes whether the memory path can sustain that.

In direct mode the RGB peripheral fetches the frame from PSRAM. That path is shared with other activity, so the available PSRAM bandwidth can limit a reliable pixel clock.

Bounce buffers

A bounce buffer changes the route. The CPU copies chunks from PSRAM into internal SRAM, and DMA feeds the RGB peripheral from those internal buffers. It can be a faster path. It costs CPU time and internal SRAM, so DMA is not simply faster.

The Espressif FAQ reports limited testing in bounce-buffer mode. It reached about 11 MHz with 80 MHz quad PSRAM, 22 MHz with 80 MHz octal and 30 MHz with 120 MHz octal. No resolution or colour depth is given. These are measured examples, not hardware limits.

Apply the 22 MHz example to our 1024 × 600 exercise and you get about 35.8 active frames per second, ignoring blanking. That is arithmetic on one FAQ example. It is not a measured frame rate and not an ESP32-S3 limit.

What the chip offers

The ESP32-S3 drives RGB panels with data lines 8 or 16 wide, and we teach a 16-bit RGB565 configuration. The ESP32-P4 also has LCD_CAM. The ESP32 pages in the book go further into MIPI displays.

Common mistakes

  • The frame fits, so it will be smooth. Fitting is capacity. Smooth animation also needs bandwidth and a delivery path that keeps up with the display clock.
  • DMA makes it fast. A bounce buffer trades CPU time and internal SRAM for a steadier feed. It helps only when memory bandwidth was the limit.
  • Reading the FAQ figures as chip limits. 11, 22 and 30 MHz are results under specific PSRAM configurations, in limited testing.

Edit this page — content/fundamentals/screens/frame-buffer-psram-dma.mdx

Discuss this article

Ask about this page. The answer stays here, on the page it belongs to, for whoever hits the same wall next.

Browse Fundamentals on the forum →