mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
fix: budget workers for expensive captures
This commit is contained in:
@@ -35,11 +35,6 @@ const FORMAT_EXT: Record<string, string> = { mp4: ".mp4", webm: ".webm", mov: ".
|
||||
|
||||
const CPU_CORE_COUNT = cpus().length;
|
||||
|
||||
/** 3/4 of CPU cores, capped at 8. Each worker spawns a Chrome process (~256 MB). */
|
||||
function defaultWorkerCount(): number {
|
||||
return Math.max(1, Math.min(Math.floor((CPU_CORE_COUNT * 3) / 4), 8));
|
||||
}
|
||||
|
||||
export default defineCommand({
|
||||
meta: {
|
||||
name: "render",
|
||||
@@ -216,12 +211,9 @@ export default defineCommand({
|
||||
}
|
||||
|
||||
// ── Print render plan ─────────────────────────────────────────────────
|
||||
const workerCount = workers ?? defaultWorkerCount();
|
||||
if (!quiet) {
|
||||
const workerLabel =
|
||||
args.workers != null
|
||||
? `${workerCount} workers`
|
||||
: `${workerCount} workers (auto — ${CPU_CORE_COUNT} cores detected)`;
|
||||
workers != null ? `${workers} workers` : `auto workers (${CPU_CORE_COUNT} cores detected)`;
|
||||
console.log("");
|
||||
console.log(
|
||||
c.accent("\u25C6") +
|
||||
@@ -307,7 +299,7 @@ export default defineCommand({
|
||||
fps,
|
||||
quality,
|
||||
format,
|
||||
workers: workerCount,
|
||||
workers,
|
||||
gpu: useGpu,
|
||||
hdr: args.hdr ?? false,
|
||||
crf,
|
||||
@@ -319,7 +311,7 @@ export default defineCommand({
|
||||
fps,
|
||||
quality,
|
||||
format,
|
||||
workers: workerCount,
|
||||
workers,
|
||||
gpu: useGpu,
|
||||
hdr: args.hdr ?? false,
|
||||
crf,
|
||||
@@ -335,7 +327,7 @@ interface RenderOptions {
|
||||
fps: 24 | 30 | 60;
|
||||
quality: "draft" | "standard" | "high";
|
||||
format: "mp4" | "webm" | "mov";
|
||||
workers: number;
|
||||
workers?: number;
|
||||
gpu: boolean;
|
||||
hdr: boolean;
|
||||
crf?: number;
|
||||
@@ -604,7 +596,7 @@ function trackRenderMetrics(
|
||||
durationMs: elapsedMs,
|
||||
fps: options.fps,
|
||||
quality: options.quality,
|
||||
workers: options.workers,
|
||||
workers: options.workers ?? perf?.workers,
|
||||
docker,
|
||||
gpu: options.gpu,
|
||||
compositionDurationMs,
|
||||
|
||||
@@ -8,7 +8,7 @@ export function trackRenderComplete(props: {
|
||||
durationMs: number;
|
||||
fps: number;
|
||||
quality: string;
|
||||
workers: number;
|
||||
workers?: number;
|
||||
docker: boolean;
|
||||
gpu: boolean;
|
||||
// Composition metadata
|
||||
|
||||
@@ -5,7 +5,6 @@ const BASE: DockerRenderOptions = {
|
||||
fps: 30,
|
||||
quality: "standard",
|
||||
format: "mp4",
|
||||
workers: 4,
|
||||
gpu: false,
|
||||
hdr: false,
|
||||
crf: undefined,
|
||||
@@ -43,17 +42,28 @@ describe("buildDockerRunArgs", () => {
|
||||
"standard",
|
||||
"--format",
|
||||
"mp4",
|
||||
"--workers",
|
||||
"4",
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
it("omits --workers when auto sizing should happen inside the container", () => {
|
||||
const args = buildDockerRunArgs({ ...FIXED_INPUT, options: BASE });
|
||||
expect(args).not.toContain("--workers");
|
||||
});
|
||||
|
||||
it("matches snapshot when every renderer flag is enabled", () => {
|
||||
expect(
|
||||
buildDockerRunArgs({
|
||||
...FIXED_INPUT,
|
||||
options: { ...BASE, gpu: true, hdr: true, crf: 18, videoBitrate: undefined, quiet: true },
|
||||
options: {
|
||||
...BASE,
|
||||
workers: 4,
|
||||
gpu: true,
|
||||
hdr: true,
|
||||
crf: 18,
|
||||
videoBitrate: undefined,
|
||||
quiet: true,
|
||||
},
|
||||
}),
|
||||
).toMatchInlineSnapshot(`
|
||||
[
|
||||
|
||||
@@ -22,7 +22,7 @@ export interface DockerRenderOptions {
|
||||
fps: 24 | 30 | 60;
|
||||
quality: "draft" | "standard" | "high";
|
||||
format: "mp4" | "webm" | "mov";
|
||||
workers: number;
|
||||
workers?: number;
|
||||
gpu: boolean;
|
||||
hdr: boolean;
|
||||
crf?: number;
|
||||
@@ -54,8 +54,7 @@ export function buildDockerRunArgs(input: DockerRunArgsInput): string[] {
|
||||
options.quality,
|
||||
"--format",
|
||||
options.format,
|
||||
"--workers",
|
||||
String(options.workers),
|
||||
...(options.workers != null ? ["--workers", String(options.workers)] : []),
|
||||
...(options.crf != null ? ["--crf", String(options.crf)] : []),
|
||||
...(options.videoBitrate ? ["--video-bitrate", options.videoBitrate] : []),
|
||||
...(options.quiet ? ["--quiet"] : []),
|
||||
|
||||
Reference in New Issue
Block a user