Kofferdetektiv iPad-Performance: sicheres Buendel (Aufloesung + AA + GPU)

Nur auf Touch-Geraeten (Desktop unveraendert):
- Render-Aufloesung auf dpr 1.3 gedeckelt (dprCap-Helper) statt bis 2 —
  dpr 2 = 4x Pixel war der teuerste Posten.
- antialias aus (MSAA teuer auf Mobile), Retina-Dichte kaschiert Kanten.
- powerPreference:'high-performance' fuer die staerkere GPU-Pipeline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 14:13:35 +02:00
parent 11c48817de
commit 62e903a5ec
+10 -5
View File
@@ -18,6 +18,11 @@ const STORE_KEY = 'kofferdetektiv.v1';
const $ = id => document.getElementById(id);
const IS_TOUCH = matchMedia('(pointer: coarse)').matches;
// iPad-Performance: dpr 2 = 4× Pixel und der teuerste Posten. Auf Touch die
// Render-Auflösung auf 1.3 deckeln (Retina-Dichte kaschiert es), Desktop bleibt
// bei seinem jeweiligen Cap.
const TOUCH_DPR_CAP = 1.3;
const dprCap = hi => Math.min(window.devicePixelRatio || 1, IS_TOUCH ? TOUCH_DPR_CAP : hi);
/* ============================================================
* AUDIO — SFX, Ambience, PA-Durchsagen, Musik
@@ -624,8 +629,8 @@ const World = {
init(canvas) {
this.camera = new THREE.PerspectiveCamera(72, canvas.clientWidth / canvas.clientHeight, 0.1, 320);
this.renderer = new THREE.WebGLRenderer({ canvas, antialias: true });
this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 1.6));
this.renderer = new THREE.WebGLRenderer({ canvas, antialias: !IS_TOUCH, powerPreference: 'high-performance' });
this.renderer.setPixelRatio(dprCap(1.6));
this.renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
this.bindInput(canvas);
window.addEventListener('resize', () => this.resize());
@@ -641,7 +646,7 @@ const World = {
this.boardCtx = null; this.boardTex = null; this.glbKoffer = null; this.eyeY = null;
this.doors = []; this._tpArmed = true;
// Renderer-Qualität auf Klassik-Standard zurücksetzen (GLB überschreibt)
this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 1.6));
this.renderer.setPixelRatio(dprCap(1.6));
this.renderer.toneMapping = THREE.NoToneMapping;
this.renderer.toneMappingExposure = 1;
this.renderer.shadowMap.enabled = false;
@@ -691,7 +696,7 @@ const World = {
// Qualität „all in“ (Schul-iPads ab 2022): ACES-Tonemapping, Retina,
// statisch gebackene Schatten, Environment-Reflexionen für den Boden
this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
this.renderer.setPixelRatio(dprCap(2));
this.renderer.toneMapping = THREE.ACESFilmicToneMapping;
this.renderer.toneMappingExposure = 1.12;
this.renderer.shadowMap.enabled = true;
@@ -1181,7 +1186,7 @@ const World = {
// Qualität „all in“ (Schulgeräte ab 2022): volle Auflösung, ACES-Tonemapping,
// statische Schatten (einmal gerendert, danach kostenlos)
this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
this.renderer.setPixelRatio(dprCap(2));
this.renderer.toneMapping = THREE.ACESFilmicToneMapping;
this.renderer.toneMappingExposure = 1.15;
this.renderer.shadowMap.enabled = true;