From f301d39ea00fac0eaaf80955baee91a5dde4113f Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Wed, 16 Sep 2026 23:50:34 +0200 Subject: [PATCH] =?UTF-8?q?test(world):=20Bodenplatte=20mit=20vielen=20L?= =?UTF-8?q?=C3=B6chern=20messen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erstes Risiko des Entwurfs: die Fahrbahn wird als Loch aus der Bodenplatte geschnitten, und ShapeUtils.triangulateShape läuft beim Nachladen im Hauptthread. Der Test hält fest, dass 100 Löcher je Chunk unter 50 ms bleiben und keines verschwindet. Co-Authored-By: Claude Haiku 4.5 --- tests/geometry.test.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/geometry.test.js b/tests/geometry.test.js index 541e326..43b8f56 100644 --- a/tests/geometry.test.js +++ b/tests/geometry.test.js @@ -195,4 +195,42 @@ describe("geometry", () => { } expect([deckel, aussen, innen]).toEqual([8, 8, 8]); }); + + describe("Bodenplatte mit vielen Löchern (Risiko aus dem Entwurf, Teil 2)", () => { + // 250-m-Chunk mit einem Raster aus 100 rechteckigen Löchern: die Größenordnung, die die + // Fahrbahnlöcher im dichtesten Stadtchunk erzeugen. Gemessen wird die Zeit, die + // triangulateShape dafür braucht — sie läuft beim Nachladen im Hauptthread. + const plateWithHoles = (count) => { + const outer = [[0, 0], [250, 0], [250, -250], [0, -250]]; + const holes = []; + const side = Math.ceil(Math.sqrt(count)); + for (let k = 0; k < count; k++) { + const x = 5 + (k % side) * (240 / side), z = -5 - Math.floor(k / side) * (240 / side); + const w = 240 / side - 6; + holes.push([[x, z], [x + w, z], [x + w, z - w], [x, z - w]]); + } + return [[outer, ...holes]]; + }; + + it("baut eine Platte mit 100 Löchern in unter 50 ms", () => { + const chunk = { chunk: [0, 0], origin: [0, 0], land: plateWithHoles(100), + roads: [], centerlines: [], buildings: [], palms: [] }; + const start = performance.now(); + const geo = buildChunkGeometry(chunk).ground; + const ms = performance.now() - start; + console.log(`ZEITMESSUNG: ${ms.toFixed(2)} ms`); + expect(geo).not.toBeNull(); + // Jedes Loch bringt vier Wandvierecke; die Deckfläche kommt dazu. + expect(geo.getAttribute("position").count).toBeGreaterThan(100 * 16); + expect(ms).toBeLessThan(50); + }); + + it("lässt kein Loch verschwinden", () => { + const chunk = { chunk: [0, 0], origin: [0, 0], land: plateWithHoles(25), + roads: [], centerlines: [], buildings: [], palms: [] }; + const geo = buildChunkGeometry(chunk).ground; + // Ohne Löcher hätte die Platte 4 Ringpunkte für die Wände plus 4 für die Decke. + expect(geo.getAttribute("position").count).toBeGreaterThan(25 * 16); + }); + }); });