ecs: let a changes finalizer learn that components with a trait were written through a row

Offen
#253 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
15/100
Issue-Typ
Feature
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
typescript
Bereich
devtools

Rechercherichtung

The request is a design change to the changes finalizer in the ECS layer, so start by locating how Finalizer.changes and its watch option are implemented and how row assignment (row[component] = value) is tracked versus command-based structural changes. Decide whether a per-table dirty bit or a changes.written field is the right shape, and agree the API with maintainers before writing code. Done means a finalizer watching a trait is notified when a row system writes one of its components, without scanning rows.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Summary

A changes finalizer can't see a component's value being written through a row (row[component] = value in a row system), only structural changes (added, removed, spawned, despawned). So state that lives in a component and is moved by a row system (a camera's position and look, moved every frame by the control) can't be saved on change by a finalizer that watches a trait, and has to be polled.

Where this came from (mecs)

mecs keeps per-tab state (the camera's cameraPosition and cameraLook, plus resources like the selected tool) under a trait of the app's own (inTab). With 0.3.0 trait watches (#242) the resources are noticed by Finalizer.changes({ watch: [inTab] }), which is what I wanted. But the camera is a component of an entity and controlCamera moves it with row assignments:

System.create({ components: { with: [cameraPosition, cameraLook, ...] } }, row => {
    row[cameraPosition] = next.position;   // not reported to a changes finalizer
});

A finalizer watching inTab never fires for that. So the tab's state is polled four times a second (take a snapshot, encode it, compare bytes) which is correct but does the encode work 240 times a minute while nothing changes.

What I need

Some way for a finalizer (or a system) to learn that components with a trait were written this tick, by row or by command, without scanning every row:

  • a changes.written (or the existing changes.groups carrying replaced for row writes) per table for watched components; or
  • a Finalizer.changes option that also reports "this table's column was written", coarse is fine (a table-level dirty bit per watched column, set by row assignment, cleared when finalizers have run). I don't need which row or the values, only that something changed, because the consumer re-snapshots.

The changed: [component] filter of a system already has this information per row (it is how deriveCells runs only on moved voxels), so the world already tracks a version per column or row; this is asking for it to be reachable from a finalizer's watch, including by trait.

Why a coarse signal is enough

The consumer is "save the tab's state soon after it changes": a timer then a snapshot. A dirty flag per watched table, read once per tick, replaces the 4 Hz byte-comparing poll with nothing at all while idle.

Vorherrschende Sprache
TypeScript
Sterne
12
Forks
8
Ø Merge
11 Std. 2 Min.
Gemergte PRs (30 T.)
23

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus adobe/data

Alle Issues in adobe/data

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.