perf: dual queue, GLB caching, WebP output, persistent BVH
Task 4: Dual render queue - render-worker: heavy (asset_pipeline, concurrency=1) — HQ 2048x2048, animations - render-worker-light: light (asset_pipeline_light, concurrency=2) — thumbnails, <=1024 - Thumbnails routed to light queue automatically - Order line renders routed by resolution at dispatch time Task 5: GLB caching (skip re-tessellation) - Before tessellating, check if gltf_geometry MediaAsset exists for the cad_file_id - If found, copy to expected path — render_blender.py finds it and skips tessellation - Saves 7-11s per re-render of the same product Task 6: WebP output format - New 'webp' option in output_format (OutputType admin) - Blender renders PNG intermediate, Pillow converts to WebP (quality=90, method=4) - 50-70% smaller files with no visible quality loss - Correct MIME type (image/webp) in MediaAsset Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -41,7 +41,7 @@ Current baseline (2048x2048, 256 samples, Cycles GPU, OIDN denoiser):
|
||||
- **Dependencies**: None
|
||||
- **Risk**: Low — Blender 5.0 supports this; increases VRAM usage slightly
|
||||
|
||||
### [ ] Task 4: Dual render queue for light/heavy workloads
|
||||
### [x] Task 4: Dual render queue for light/heavy workloads
|
||||
|
||||
- **Files**:
|
||||
- `docker-compose.yml` — add second render-worker service for light tasks
|
||||
@@ -55,7 +55,7 @@ Current baseline (2048x2048, 256 samples, Cycles GPU, OIDN denoiser):
|
||||
- **Dependencies**: Task 1 (lower samples for light queue makes concurrent rendering safer)
|
||||
- **Risk**: Medium — VRAM contention if both workers render simultaneously. Mitigated by thumbnails being small (512x512, 64 samples = minimal VRAM)
|
||||
|
||||
### [ ] Task 5: Skip re-tessellation when GLB already exists
|
||||
### [x] Task 5: Skip re-tessellation when GLB already exists
|
||||
|
||||
- **File**: `backend/app/services/render_blender.py`
|
||||
- **What**: In `render_still()`, the STEP→GLB tessellation runs every time. Cache the GLB file per CAD file (already stored as `gltf_geometry` MediaAsset). Before tessellating, check if a GLB MediaAsset exists for this cad_file_id and reuse it.
|
||||
@@ -64,7 +64,7 @@ Current baseline (2048x2048, 256 samples, Cycles GPU, OIDN denoiser):
|
||||
- **Dependencies**: Task 2 (USD path is preferred; this is fallback for products without USD)
|
||||
- **Risk**: Low — GLB is deterministic per CAD file; if the CAD file changes, a new GLB is generated
|
||||
|
||||
### [ ] Task 6: Output format optimization (WebP for stills)
|
||||
### [x] Task 6: Output format optimization (WebP for stills)
|
||||
|
||||
- **File**: `render-worker/scripts/_blender_scene_setup.py` (or `blender_render.py`)
|
||||
- **What**: After Blender renders a PNG, optionally convert to WebP for 50-70% smaller files. Add a `webp` output format option to OutputType. When selected, render as PNG then convert via Pillow.
|
||||
|
||||
Reference in New Issue
Block a user