# Zed Text Rendering Performance Optimizations: How GPUI Achieves 60 FPS Editing

> Discover how Zed achieves 60 FPS text rendering with GPUI through aggressive caching, batching GPU calls, and native glyph rasterization. Edit massive files smoothly.

- Repository: [Zed Industries/zed](https://github.com/zed-industries/zed)
- Tags: performance
- Published: 2026-03-01

---

**Zed maintains fluid 60 FPS editing even with massive files by aggressively caching line layouts, batching GPU draw calls at frame boundaries, and delegating glyph rasterization to platform-native APIs.**

The zed-industries/zed repository implements a sophisticated text rendering pipeline within its **GPUI** framework that eliminates redundant computation through strategic caching. These **Zed text rendering performance optimizations** ensure that only visible or modified content triggers layout recalculation, keeping CPU usage minimal during scrolling and editing of large codebases.

## Line-Level Caching with LineLayoutCache

The cornerstone of Zed's performance strategy is the **LineLayoutCache** struct defined in [`crates/gpui/src/text_system/line_layout.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/text_system/line_layout.rs) at line 392. This cache stores complete layout information—including wrapping decisions, font metrics, and glyph runs—for each line of text.

When the editor requests a layout, the cache first checks for an existing entry. If the line's text hasn't changed, the cached layout returns immediately, avoiding expensive re-measurement. The cache actively manages memory by recycling unused layouts and truncating old entries, ensuring that long editing sessions don't consume unbounded RAM.

According to the source code at line 412, the cache methods handle layout reuse transparently, allowing the editor to finish a frame in a single call without rebuilding identical lines repeatedly.

## Incremental Layout via TextLayout

Rather than laying out entire documents, Zed employs **lazy evaluation** through the `TextLayout` struct in [`crates/gpui/src/elements/text.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/elements/text.rs) (line 322). This approach constructs layout data only for portions of the buffer that are actually visible.

The internal `TextLayoutInner` structure (line 324) manages the actual layout state. When a user scrolls, `TextLayout` queries the cache for the specific lines entering the viewport instead of recomputing the whole document. This incremental strategy ensures that opening a 100,000-line file costs no more than opening a blank one, provided only a screen's worth of content is visible.

## Styled Text Runs for Reduced Draw Calls

Zed minimizes GPU draw calls by grouping text into **styled runs**—contiguous segments sharing identical font, weight, and color properties. The `TextRun` and `TextStyle` definitions in [`crates/gpui/src/text_system.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/text_system.rs) (line 774) enable this optimization.

By rendering an entire run as a single glyph operation rather than individual characters, the system dramatically reduces the overhead submitted to the GPU. This batching at the layout level complements the frame-level batching performed later in the pipeline.

## Platform-Native Glyph Caching

The GPUI framework abstracts over platform-specific text backends: **DirectWrite** on Windows, **CoreText** on macOS, and **Skia** on Linux. These backends provide low-level glyph metric queries and rasterization that Zed caches aggressively.

In [`crates/gpui_windows/src/direct_write.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui_windows/src/direct_write.rs), the glyph metric helpers (lines 250–280) and `rasterize_glyph` logic (lines 254–300) demonstrate how bitmaps are generated once per font/size/glyph combination and retained in memory. Subsequent renders of the same character reuse the cached bitmap, eliminating the costly rasterization step that typically bottlenecks text editors.

## Frame Batching with finish_frame

To prevent CPU-GPU synchronization stalls, Zed accumulates all pending layout work and flushes it once per frame. The `finish_frame` method in [`crates/gpui/src/text_system.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/text_system.rs) (line 573) implements this batching strategy.

By coalescing draw calls into a single submission, the GPU driver can optimize command execution without intermediate stalls. This approach ensures that text layout computation and rendering commands are submitted efficiently, maintaining the 16 ms frame budget required for smooth UI interaction.

## Code Examples

The following snippets demonstrate how these optimizations are accessed within the Zed codebase.

Accessing cached line layouts:

```rust
let layout = text_system
    .line_layout_cache
    .layout_line(line_ix, text, &style, cx);

```

Creating an incremental TextLayout:

```rust
let mut layout = TextLayout::default();  // from elements/text.rs
layout.set_text(&editor.buffer, cx);
let line_layout = layout.layout();  // returns cached TextLayoutInner

```

Measuring styled runs:

```rust
let run = TextRun {
    text: segment.clone(),
    style: style.clone(),
};
let (metrics, glyphs) = text_system.measure_run(&run, cx);

```

Flushing frame batched updates:

```rust
text_system.finish_frame(cx);

```

## Summary

- **LineLayoutCache** in [`crates/gpui/src/text_system/line_layout.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/text_system/line_layout.rs) eliminates redundant line measurements by storing layouts keyed by content hash and line index.
- **Incremental TextLayout** constructs visible portions lazily, ensuring massive files don't impact initial render performance or scrolling speed.
- **Styled runs** reduce GPU draw calls by rendering contiguous same-style text as single glyph operations rather than individual characters.
- **Platform backends** (DirectWrite, CoreText, Skia) cache rasterized glyphs at the OS level, avoiding repeated bitmap generation for identical characters.
- **Frame batching** via `finish_frame` minimizes CPU-GPU synchronization overhead by submitting all draw calls in a single operation per frame.

## Frequently Asked Questions

### How does Zed handle soft-wrapped lines without performance degradation?

Zed treats wrapped visual lines as distinct cached entities. The `layout_wrapped_line` call in [`crates/gpui/src/text_system.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/text_system.rs) (line 512) creates layouts for each visual line only once, reusing them across scroll operations and redraws even when the underlying logical line remains active in the buffer.

### What prevents Zed from lagging when opening multi-megabyte files?

The combination of **incremental layout** and **line-level caching** ensures that only the visible viewport triggers computation. When opening large files, Zed does not measure off-screen content; it requests layouts exclusively for lines intersecting the current scroll region via the `TextLayout` system in [`crates/gpui/src/elements/text.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/elements/text.rs).

### Does Zed cache rasterized glyphs between frames?

Yes. The platform-specific backends maintain **glyph raster caches** that store bitmaps for each font/size/glyph combination. As implemented in [`crates/gpui_windows/src/direct_write.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui_windows/src/direct_write.rs), the `rasterize_glyph` function (lines 254–300) retrieves existing bitmaps from memory before generating new ones, ensuring repeated characters render instantly without redundant rasterization.

### How does the line layout cache handle memory pressure?

The `LineLayoutCache` implements eviction policies that recycle unused layouts and truncate historical entries. This prevents unbounded memory growth during long editing sessions while maintaining high hit rates for recently viewed content, as detailed in the implementation at [`crates/gpui/src/text_system/line_layout.rs`](https://github.com/zed-industries/zed/blob/main/crates/gpui/src/text_system/line_layout.rs).