fix(world): geteilte Requisiten-Geometrie beim Chunk-Abbau verschonen
Ruling 62: PropLayer-Geometrien (Palme, Laternenteile, Stammkollider) sind Singletons über alle Chunks; #unload gab bei jedem Nachbarabbau ihre GPU-Puffer frei. mesh.userData.sharedGeometry markiert sie, #unload überspringt sie jetzt beim Entsorgen. Ruling 63: geschlossene Ringe (Laufzeitform) waren in keiner Testvorrichtung gepinnt, obwohl der Code sie bereits korrekt behandelte. Ruling 64: der Zweig `if (this.props)` bekommt direkte Testabdeckung statt nur der manuellen Probe aus Fix-Runde 1. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d6a2f6d269
commit
02d0f36580
4 files changed
+152
-25
No files matched your search
@@ -115,7 +115,13 @@ export class ChunkStreamer {
|
||||
// Ruling 51: collider-lose Chunks (offenes Wasser) haben kein handle abzumelden.
|
||||
if (entry.handle) this.player.removeCollider(entry.handle);
|
||||
this.scene.remove(entry.group);
|
||||
entry.group.traverse((o) => o.geometry?.dispose());
|
||||
// Ruling 62: this.palmGeometry, das Palmenmaterial und die Laternenteile entstehen
|
||||
// einmal in PropLayer.load() und werden von jedem Chunk benutzt (props.visual landet
|
||||
// hier in derselben Gruppe). Ohne die Wache würde jeder Chunk-Abbau ihre GPU-Puffer
|
||||
// freigeben, während Nachbarchunks sie noch anzeigen — kein Absturz (dispose() lässt
|
||||
// die CPU-Daten stehen, der nächste Zugriff lädt still neu hoch), aber unnötige Arbeit
|
||||
// bei jedem Abbau. mesh.userData.sharedGeometry markiert das, analog excludeFromCollider.
|
||||
entry.group.traverse((o) => { if (o.geometry && !o.userData.sharedGeometry) o.geometry.dispose(); });
|
||||
this.active.delete(k);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user