Compare commits

...

1 Commits

Author SHA1 Message Date
Alexander Whitestone
c34748704e fix: [PERF] Add quality-tier feature gating for heavy visual effects (closes #706)
Some checks failed
CI / test (pull_request) Failing after 10s
CI / validate (pull_request) Failing after 15s
Review Approval Gate / verify-review (pull_request) Failing after 2s
2026-04-12 11:51:40 -04:00

32
app.js
View File

@@ -704,13 +704,13 @@ async function init() {
createParticles(); createParticles();
createDustParticles(); createDustParticles();
updateLoad(85); updateLoad(85);
createAmbientStructures(); if (performanceTier !== "low") createAmbientStructures();
createAgentPresences(); createAgentPresences();
createThoughtStream(); if (performanceTier !== "low") createThoughtStream();
createHarnessPulse(); createHarnessPulse();
createSessionPowerMeter(); createSessionPowerMeter();
createWorkshopTerminal(); createWorkshopTerminal();
createAshStorm(); if (performanceTier !== "low") createAshStorm();
SpatialMemory.init(scene); SpatialMemory.init(scene);
MemoryBirth.init(scene); MemoryBirth.init(scene);
MemoryBirth.wrapSpatialMemory(SpatialMemory); MemoryBirth.wrapSpatialMemory(SpatialMemory);
@@ -730,14 +730,20 @@ async function init() {
fetchGiteaData(); fetchGiteaData();
setInterval(fetchGiteaData, 30000); // Refresh every 30s setInterval(fetchGiteaData, 30000); // Refresh every 30s
composer = new EffectComposer(renderer); // Quality-tier feature gating: only enable heavy post-processing on medium/high
composer.addPass(new RenderPass(scene, camera)); if (performanceTier !== 'low') {
const bloom = new UnrealBloomPass( composer = new EffectComposer(renderer);
new THREE.Vector2(window.innerWidth, window.innerHeight), composer.addPass(new RenderPass(scene, camera));
0.6, 0.4, 0.85 const bloomStrength = performanceTier === 'high' ? 0.6 : 0.35;
); const bloom = new UnrealBloomPass(
composer.addPass(bloom); new THREE.Vector2(window.innerWidth, window.innerHeight),
composer.addPass(new SMAAPass(window.innerWidth, window.innerHeight)); bloomStrength, 0.4, 0.85
);
composer.addPass(bloom);
composer.addPass(new SMAAPass(window.innerWidth, window.innerHeight));
} else {
composer = null;
}
updateLoad(95); updateLoad(95);
@@ -3127,7 +3133,7 @@ function gameLoop() {
core.material.emissiveIntensity = 1.5 + Math.sin(elapsed * 2) * 0.5; core.material.emissiveIntensity = 1.5 + Math.sin(elapsed * 2) * 0.5;
} }
composer.render(); if (composer) { composer.render(); } else { renderer.render(scene, camera); }
updateAshStorm(delta, elapsed); updateAshStorm(delta, elapsed);
@@ -3166,7 +3172,7 @@ function onResize() {
camera.aspect = w / h; camera.aspect = w / h;
camera.updateProjectionMatrix(); camera.updateProjectionMatrix();
renderer.setSize(w, h); renderer.setSize(w, h);
composer.setSize(w, h); if (composer) composer.setSize(w, h);
} }
// ═══ AGENT SIMULATION ═══ // ═══ AGENT SIMULATION ═══