InDesign 2026 (macOS): every open CEP panel costs ~20–25% CPU continuously
InDesign 2026 (macOS): every open CEP panel costs ~20–25% CPU continuously — the host redraws the panel at display refresh rate even when the panel is completely static
Summary
With any CEP (HTML) extension panel open, the InDesign process burns roughly
20–25% CPU permanently on a 120 Hz display, with no user interaction and no
activity in the panel. Each additional open panel adds the same again (three
panels ≈ 75%). Closing the panel, or collapsing it to a dock icon, returns
InDesign to its ~5% idle baseline immediately.
Call-stack sampling shows InDesign's main thread spending ~67% of its time in
-[MTKView draw] → PlugPlugOwl.framework, which on EVERY display-link tick
allocates a new MTLTexture, runs a CPU pixel-conversion pass over the whole
panel bitmap, and uploads the full bitmap with
-[MTLTexture replaceRegion:mipmapLevel:withBytes:bytesPerRow:] — even though
the panel's renderer (CEPHtmlEngine) is idle and has produced no new frame.
The MTKView appears to be in continuous-draw mode at the display's native
refresh rate rather than paused-and-drawn-on-demand.
Illustrator 2026 on the same machine, with the same PlugPlugOwl 12.1.0.5
build, does NOT show this: opening a CEP panel there adds no CPU at all. So
the issue is in InDesign's hosting of the CEP view, not in CEP/CEF itself.
Environment
- Adobe InDesign 2026, version 21.5.1.73 (build 21510)
- macOS 26.6.2 (25G83), Apple M1 (8-core), 16 GB
- Display: DELL U2725QE, 3840×2160 at 120 Hz, UI scaled to 1920×1080 (2×)
- CEP 12.1.0 (CSXS 12);
PlugPlugOwl.framework12.1.0.5 inside the InDesign app bundle; CEPHtmlEngine Chrome/99.0.4844.84 - CEP
PlayerDebugMode = 1(unsigned development panels), but the panels used are ordinary HTML panels with no special CEF command-line flags - For comparison: Adobe Illustrator 2026 (30.8.0) — same machine, same PlugPlugOwl build — is unaffected
- Persists after a full restart of InDesign: [ ] yes / [ ] no ← fill in
Steps to reproduce
- Launch InDesign, let it settle, watch the InDesign process in Activity Monitor: ~5% CPU at idle.
- Open any CEP HTML panel. (Reproduced with three different in-house panels;
the one used for the measurements below is a fully static page — no
timers, no
requestAnimationFrame, no CSS animations, no polling.) - Do nothing. InDesign's CPU rises by ~20–25% and stays there for as long as the panel is open.
- Open a second and third panel: each adds ~20–25% more (≈75% with three).
- Close a panel: CPU drops by the same amount immediately. Collapse a panel to a dock icon: same — cost goes to zero.
Expected
An idle panel should cost ~0%. The host should redraw the panel's view only
when CEF delivers a new frame.
Actual
The host redraws — and re-uploads the full panel bitmap to a NEW Metal
texture — on every vblank, regardless of whether the panel content changed.
Evidence
1. It is the InDesign process, not the panel's renderer. With one static
panel open (Activity Monitor): InDesign 50–58% (with sample running
concurrently; ~30% without), the panel's CEPHtmlEngine process 0.8%. A Chrome
DevTools Protocol CPU profile of the panel page over the same period was
99.7% idle, and document.getAnimations() returned an empty list — the page
produced no new frames.
2. Call-stack sample (attached: indesign-sample-one-panel-open.txt,
sample <pid> 5 at 1 ms). Of 3465 main-thread samples, 2310 (67%) are:
-[NSApplication run] … __CFRunLoopRun → _dispatch_main_queue_drain
→ __23-[MTKView __initCommon]_block_invoke (MetalKit)
→ -[MTKView draw]
→ PlugPlugOwl +0xf0ea8 → +0xf03ec → +0xf07ec (2302 samples)
├─ PlugPlugOwl +0xf0da4 → +0xf5b20/+0xf5b64/… (1216 samples — a per-pixel CPU loop over the panel bitmap)
├─ PlugPlugOwl +0xf0874 → -[IOGPUMetalTexture replaceRegion:mipmapLevel:withBytes:bytesPerRow:]
│ → AGX::Texture::writeRegion / processCompressedRegion2D (342 samples — full-bitmap upload)
├─ PlugPlugOwl +0xf0744 → -[AGXTexture initWithDevice:desc:…] → IOGPUResourceCreate (35 samples — a NEW texture every frame)
└─ PlugPlugOwl +0xf087c → _xzm_free_large_huge (freeing a large buffer every frame)
The CEP CVDisplayLink thread in the same sample shows MetalKit's
DisplayLinkCallback → dispatch_source_merge_data → _dispatch_runloop_queue_poke
on every vblank — i.e. the MTKView is running with isPaused = NO /
enableSetNeedsDisplay = NO at the display's refresh rate.
For comparison, indesign-sample-panels-closed.txt is the same sample with
all panels closed: the main thread is ~96% blocked in mach_msg and there
are no PlugPlugOwl frames at all.
3. The cost tracks the display refresh rate. Switching the display from
120 Hz to 60 Hz (nothing else changed) roughly halved InDesign's CPU with the
panel open (one measurement: 58% → 24%).
4. The cost tracks the panel's pixel area. Resizing the panel larger /
smaller moves InDesign's CPU up / down accordingly.
5. A collapsed (icon-docked) panel costs nothing — consistent with the
per-frame work being proportional to the view's size.
6. Illustrator is unaffected. Same machine, same session, Illustrator
2026 with a CEP panel open stays at ~2% CPU.
Impact
Every CEP extension — third-party and Adobe's own — costs a sustained ~20–25%
of a CPU core per open panel on any 120 Hz display, which includes every
MacBook Pro since 2021 (ProMotion). Users who keep two or three panels open
have InDesign sitting at 50–75% CPU all day: lag, fans, battery drain, and the
effect compounds with other work. Users are unlikely to attribute it to the
panels since the panels themselves look idle and their renderer processes
show ~0%.
Related reports
InDesign 2022 17.3 – HIGH CPU when idle
(community forum, Jul 2022 – Jan 2024, unresolved). Very likely this same
bug seen from the outside: 30–40% idle CPU in the InDesign process itself
(the reporter ruled out CEPHtmlEngine when staff pointed at it) on a 16"
M1 Max MacBook Pro — a 120 Hz ProMotion display — persisting from 17.0
through the 2024 release. The default workspace includes the CC Libraries
panel, which is a CEP panel, so a user needs no third-party extension to
hit it. Quick check for that thread's reporters: collapse the Libraries
panel to an icon and watch the CPU drop.High GPU load on macOS 26 Tahoe
(Illustrator UserVoice, also reported for InDesign; status "Started",
3 Aug 2026: "platform-level compositing issue … flagged with Apple",
workaround in Illustrator beta 30.8.0.72). Adjacent but NOT the same
issue — that one is WindowServer GPU with the app's CPU low, whereas this
is CPU inside the InDesign process in its own MTKView draw. Please don't
merge them; note that Illustrator 30.8.0, which carries that workaround,
is the app that does NOT show this problem.
Suggested fix
In the InDesign side of the CEP view hosting (PlugPlugOwl's MTKView usage):
- Run the MTKView paused (
isPaused = YES,enableSetNeedsDisplay = YES) and callsetNeedsDisplayonly when CEF delivers a new frame (OnPaint), the way Illustrator's hosting evidently already behaves. - Reuse one
MTLTextureper view rather than allocating and freeing one per frame, and skip the CPU conversion + upload when the frame is unchanged.
Workarounds for affected users
- Set the display refresh rate to 60 Hz (halves the cost).
- Collapse panels to dock icons when not in use (cost goes to zero).
- Keep panels closed rather than open-but-idle.
Attachments
indesign-sample-one-panel-open.txt—sampleof the InDesign process, 5 s at 1 ms, one static CEP panel open.indesign-sample-panels-closed.txt— same, all panels closed (baseline).
This bug report produced at my request by Claude Code Fable.