diff --git a/App/sims/kofferdetektiv/engine.js b/App/sims/kofferdetektiv/engine.js index af2c3b7..86fc170 100644 --- a/App/sims/kofferdetektiv/engine.js +++ b/App/sims/kofferdetektiv/engine.js @@ -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;