BeginFrame probe times out with 6+ workers on one GPU, and the render silently falls back to screenshot capture
Maintainer thường phản hồi trong vòng 1 ngày
@crmne đang làm issue này rồi.
Từ ngày 27/9/2026.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 72/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- node.js, typescript
- Lĩnh vực
- backend, performance
Hướng nghiên cứu
Start with parallelCoordinator.ts around lines 1120 and 165 to trace simultaneous worker startup and the minimum worker count, then read browserManager.ts around lines 256 and 729 for the probe deadline and screenshot fallback. Reproduce with the six-worker command and verify that transient BeginFrame timeouts retry successfully, requested failures surface an error, and hardware-GPU fallback reporting is visible.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
With --browser-gpu on a hardware GPU, once 6 or more workers start together, every worker's BeginFrame probe times out. Each worker relaunches in screenshot mode, and the render takes about twice as long but still exits 0. The only signs are the summary line (screenshot capture · hardware gpu) and one [BrowserManager] warning per worker. --workers auto picks 6 on this machine, so a default GPU render always takes the slow path.
Environment
hyperframes 0.8.79 (same on main at e00baefb5), chrome-headless-shell 152.0.7977.30, ANGLE on EGL, Linux 7.2.5, NVIDIA RTX 3090 (driver 610.57.04), Node 25.9.0. hyperframes doctor passes.
Reproduction
A 10 s 1080p30 composition with one GSAP tween (no WebGL, no media):
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<style>
html, body { margin: 0; background: #111; }
#root { position: relative; width: 1920px; height: 1080px; overflow: hidden; }
.box { position: absolute; top: 490px; left: 100px; width: 100px; height: 100px; background: #3af; }
</style>
</head>
<body>
<div id="root" data-composition-id="main" data-start="0" data-width="1920" data-height="1080" data-duration="10" data-fps="30">
<div class="box" id="box"></div>
</div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
tl.to("#box", { x: 1620, rotation: 360, duration: 10, ease: "none" }, 0);
window.__timelines["main"] = tl;
</script>
</body>
</html>
npx [email protected] render --browser-gpu --gpu --workers 6 --output out.mp4; echo "exit $?"
# [BrowserManager] HeadlessExperimental.beginFrame probe failed after 2001ms: beginFrame probe timeout during warm-up beginFrame; falling back to screenshot mode. (x6)
# screenshot capture · hardware gpu · ... capture 7.5s
# exit 0
| Workers | Capture path | Wall time (median) | Probe timeouts |
|---|---|---|---|
| 1 to 5 | beginframe (every run) | 5.4 to 6.5 s | 0 |
| 6, 7, 8 | screenshot (every run) | 9.6 to 11.0 s | all workers |
| auto (6) | screenshot | 10.1 s | 5 or 6 of 6 |
| 60 s clip, 5 / 6 workers | beginframe / screenshot | 10.3 s / 22.2 s | 0 / 6 of 6 |
5 workers is close to the edge: one run at 5 also timed out, and with a CPU-heavy job running alongside, 4 workers sometimes did too.
Cause
The first HeadlessExperimental.beginFrame does complete, just slowly while other browsers start on the same GPU. Timing it outside Hyperframes, with the exact worker flags and a 30 s deadline, it takes about 0.4 s for one browser and about 0.33 s more for each browser started alongside: 1.9 to 2.2 s at 6, and 2.7 to 3.0 s at 8. On SwiftShader the same step takes 21 to 159 ms.
- Parallel capture starts all workers at once (
parallelCoordinator.ts:1120), each probed with a single 2000 ms deadline (BEGINFRAME_PROBE_TIMEOUT_MS,browserManager.ts:256). - A probe failure only logs a warning and relaunches the browser in screenshot mode (
browserManager.ts:729), so it never reaches the exit code. defaultSafeMaxWorkers()never goes below 6 (parallelCoordinator.ts:165), whatever the GPU mode.formatScreenshotFallbackHintonly prints for a software GPU, so this case gets no hint.
Related, but not the same: #410 (auto chose 6 on a WebGL-heavy composition), #955 (SwiftShader probe contention at 6 workers per pod), #2810 (a Chrome build without BeginFrame falling back silently on Cloud Run), and #3482 (a fallback-ratio guard for drawElement).
Proposal
- Make the fallback an error on request:
--require-beginframe(envPRODUCER_REQUIRE_BEGINFRAME) fails the render with the reason instead of continuing in screenshot capture. PR to follow. - Fix the cause: retry a timed-out probe once. Locally, 6 workers, 8 workers and
autothen ran BeginFrame every time (9 of 9 renders), and the 60 s clip at 6 workers took 9.7 s instead of 22 s. A probe that genuinely fails still falls back at once. Happy to send this as a PR too. Probing the workers one at a time wasn't enough on its own (7 of 8 passed). - Print the fallback hint for hardware GPUs too.
- Ngôn ngữ chính
- TypeScript
- Star
- 54.1k
- Fork
- 4.9k
- Merge trung bình
- 7 giờ 19 phút
- Pull request đã merge (30 ngày)
- 746
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của heygen-com/hyperframes
-
gcp-cloud-run image pins Chrome 148, which drops `background-clip: text` glyphs inside layered children; the CLI's Chrome 152 paints themCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 84/100
heygen-com/hyperframes#5117 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Docs: clarify that "Enable auto-update" is only available in the Claude Code terminal (CLI) /plugin UICó thể đã có người làm @rumi7911 đã nhận 2 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
heygen-com/hyperframes#5027 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
fix(producer): propagate useGpu to HDR layered streaming encoderCó thể đã có người làm @Monster-GM đã nhận 4 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 87/100
heygen-com/hyperframes#5002 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
skills: remoteHeadSha() can open a Git Credential Manager dialog on Windows (GIT_TERMINAL_PROMPT does not cover GUI helpers; slug unvalidated)Có thể đã có người làm @RaphaelFakhri đã nhận 8 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
heygen-com/hyperframes#4702 · 1 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Studio catalog prompt editor has no accessible nameCó thể đã có người làm @lorenzozanee đã nhận 15 ngày trước. Đang mởbug difficulty/easy triage/ready
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
heygen-com/hyperframes#4384 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của heygen-com/hyperframes
Issue tương tự
-
First unknown-user login after boot is one scrypt run slower than a real user's wrong passwordĐang mởarea: backend bug priority: low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
snapotter-hq/SnapOtter#2254 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug ticket
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
cratestack/cratestack#1154 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
server 消息处理器 cmd 分支补显式错误回报——竞态非法命令现走未处理拒绝Có thể đã có người làm @openaddr đã nhận hôm nay. Đang mởready-for-agent refactor wayfinder:task
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
openaddr/dafung-web#428 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Flaky: mongodb-memory-server 'Port already in use' when another process starts a mongod concurrentlyĐang mởarea:testing bug effort:S priority:P2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
Maintainer thường phản hồi trong vòng 1 ngày
-
lens:agent lens:process process
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
thebristolsound/birdbrain#1772 ·
Maintainer thường phản hồi trong vòng 1 ngày