ecs: let a changes finalizer learn that components with a trait were written through a row
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 existingchanges.groupscarryingreplacedfor row writes) per table for watched components; or - a
Finalizer.changesoption 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
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus adobe/data
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag
-
ecs: let kernels issue commands through helpers (component lists, symbol-keyed values, void helpers)Offen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 15/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 30/100
Maintainer antworten meist innerhalb von 1 Tag
-
ecs: an architecture standard (layout, naming, exports, checker, diagrams) for the new ECS samples, and how to distribute itEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 8/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 22/100
Maintainer antworten meist innerhalb von 1 Tag
Ähnliche Issues
-
test: claim-conflict drop leaves both facts active and is never re-proposed (untested review cell)Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
Maintainer antworten meist innerhalb von 1 Tag
-
[Feature]: Usage page should show API-equivalent cost and say when a connected plan shows info onlyOffenenhancement from-x
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
nightly-labs/openbot#4867 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
egonSchiele/agency-lang#1377 ·
Maintainer antworten meist innerhalb von 1 Tag
-
normalizePath removes the Windows device namespace prefixEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
caprover/caprover-frontend#273 ·
Maintainer antworten meist innerhalb von 1 Tag