feat(world): Orte beim Vorladen vorwärmen
PlaceLayer nimmt jetzt ein optionales warmUp(root) entgegen und ruft es nach prepareModel, aber vor dem Einsetzen auf. main.js nutzt das, um Texturen hochzuladen und CSM-Shader zu übersetzen, solange der Ort noch nicht in der Szene ist — gemessen kostete das sonst rund 130 ms auf einen Schlag im ersten Bild, in dem der Hof erscheint. Schlägt das Vorwärmen fehl, wird nur gewarnt; der Ort wird trotzdem eingesetzt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
522101c026
commit
1c24fbf71e
3 files changed
+68
-7
No files matched your search
+12
-3
@@ -130,8 +130,8 @@ function loadModel(url) {
|
||||
}
|
||||
|
||||
export class PlaceLayer {
|
||||
constructor({ scene, player, places = PLACES, load = loadModel }) {
|
||||
Object.assign(this, { scene, player, places, load });
|
||||
constructor({ scene, player, places = PLACES, load = loadModel, warmUp = null }) {
|
||||
Object.assign(this, { scene, player, places, load, warmUp });
|
||||
this.models = new Map(); // id -> { root, solid }; bleibt nach dem ersten Laden erhalten
|
||||
this.pending = new Set();
|
||||
this.failed = new Set();
|
||||
@@ -161,9 +161,18 @@ export class PlaceLayer {
|
||||
if (this.models.has(id) || this.pending.has(id) || this.failed.has(id)) return;
|
||||
this.pending.add(id);
|
||||
this.load(place.url)
|
||||
.then((root) => {
|
||||
.then(async (root) => {
|
||||
const solid = prepareModel(root, place);
|
||||
if (!solid) console.warn(`Ort ${id} hat keine festen Teile und bekommt keine Kollision.`);
|
||||
// Vorwärmen (Texturupload, Shader-Übersetzung) noch hier im Vorladen: schlägt es fehl,
|
||||
// wird der Ort trotzdem eingesetzt, nur ohne den Vorteil (siehe main.js, warmUpPlace).
|
||||
if (this.warmUp) {
|
||||
try {
|
||||
await this.warmUp(root);
|
||||
} catch (err) {
|
||||
console.warn(`Ort ${id} konnte nicht vorgewärmt werden:`, err);
|
||||
}
|
||||
}
|
||||
this.models.set(id, { root, solid });
|
||||
// Nur einsetzen, wenn der Spieler noch da ist; sonst beim nächsten Herankommen.
|
||||
if (this.wanted.has(id)) this.#show(id);
|
||||
|
||||
Reference in new issue
Block a user