ecs: struct components in GPU accessors, packed u64/u128 fields, and the cost of staged archetype moves
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 38/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- typescript, wasm
- Ambito
- backend, performance
Direzione di ricerca
Start with src/interface/gpu/accessors.ts and layoutOf to see how struct layouts are handled, then trace row and kernel access to component values and their change stamping. Check the existing benchmark and profiling entry points, including src/perftest/birth.ts, for the packed-field and command-encoding costs. Done means documenting current u64/u128 support and lane change behavior, with measurements that compare packed and separate fields and define the requested accessor support.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Found while consolidating a voxel renderer's per-entity data (the mecs app, @adobe/ecs 0.3.2). Two things to verify or add, and the measurements that motivate them.
Why
Each voxel carries denormalized, derived values as separate components: a look (color 4×f32, metallic/roughness 2×f32, emission 3×f32, fade f32, refraction 2×f32) and a shade (exposure u32, occlusion 2×u32, sunlight u32). They are written by different systems at different times, so a voxel is born in four stages (spawn, then +cell, +look, +shade), each a move to another archetype, and each wakes the changes finalizers that watch those components. They are read only by render systems.
Measured with real components, 14,000 voxels, no finalizers or indexes (src/perftest/birth.ts in mecs):
| birth | per voxel |
|---|---|
spawn, then three add stages |
~1.7 µs |
| spawn with everything at once | ~0.95 µs |
So the three extra moves cost about 0.75 µs a voxel before any finalizer runs. Packing each group into one component removes two of the moves and 40 to 48 bytes of columns a voxel.
1. GPU accessors for struct components
accessorsOf (src/interface/gpu/accessors.ts) accepts only a scalar or a tuple of 2 to 4 same-typed scalars. A struct component, or a mixed tuple, is rejected ("isn't a scalar or a tuple of two to four scalars of one type"), although layoutOf already places structs for the storage rules. We can pack by hand into Vec4.U32 and unpack in WGSL, but the fields then have no names or types on either side.
Request: let an accessor name a struct component, either as a WGSL struct return or as one accessor per field (fn name_field(row) -> T), reading only the words of the fields used.
2. Packed bit fields: u64 and u128, and their cost
For the shade group (exposure 6 bits, occlusion 48, sunlight 30: 84 bits) and the look group, the natural representation is a few adjacent u32 words with bit fields. Please check, and state what holds today:
- Whether a
U64scalar (or a documented pair/quad of adjacent u32 lanes treated as a U128) can be declared, and how it reads and writes withoutBigIntin a row system, in akernel: truesystem, and in the wasm kernel. - The cost of a bit-field read-modify-write of one field of a 3×u32 component in a kernel row system, against the same field as its own
U32component. If the packed form is not about as fast, where does it lose (extra loads, a write-back of all lanes, change stamping of the whole component)? - Whether a write to one lane of a tuple component stamps
changedfor the whole component (it seems to), and what that means for a GPU upload of a chunk when only one field changed.
3. Aside: command encoding
In a profile of a 14,000-voxel fall (add fallPosition, spawn voxels, despawn fallers) encodeValue/leafValue/element, the encoding of each command's JS value object into the command buffer, was the largest single line in the ECS's own time (~15 ms of ~176). A bulk path (spawnMany(archetype, count, fill), or per-column writes from a row system for components the entity already has) would avoid the per-entity object. Related: #259.
Happy to share the benchmarks and profiles.
- Lingua principale
- TypeScript
- Stelle
- 12
- Fork
- 8
- Merge medio
- 9h 2m
- PR unite (30g)
- 25
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di adobe/data
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 57/100
I maintainer di solito rispondono entro 1 giorno
-
ecs: let kernels issue commands through helpers (component lists, symbol-keyed values, void helpers)Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 15/100
I maintainer di solito rispondono entro 1 giorno
-
createLazy: wrap nested service groups and accept partial (subset) schemasForse già presa @krisnye l’ha presa 2 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 8/100
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
langchain-ai/langchainjs#12157 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
activescott/home-infra-k8s-flux#511 ·
I maintainer di solito rispondono entro 1 giorno
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
lingdojo/kana-dojo#33753 · 1 commento · 5 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
android:player
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
follow-up needs-triage S3: minor
Difficoltà 1/5 1-3 ore Idoneità per principianti 85/100
manaflow-ai/cmux#38032 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno