@adobe/data 0.9.53 → 0.9.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cache/data-cache.js +26 -6
- package/dist/cache/data-cache.js.map +1 -1
- package/dist/cache/data-cache.test.js +12 -1
- package/dist/cache/data-cache.test.js.map +1 -1
- package/dist/cache/managed-array.js +72 -68
- package/dist/cache/managed-array.js.map +1 -1
- package/dist/ecs/archetype/create-archetype.js +131 -7
- package/dist/ecs/archetype/create-archetype.js.map +1 -1
- package/dist/internal/typed-array/get-byte-size.d.ts +1 -1
- package/dist/perftest/ecs1-perf.d.ts +54 -0
- package/dist/perftest/ecs1-perf.js +214 -0
- package/dist/perftest/ecs1-perf.js.map +1 -0
- package/dist/perftest/ecs2-perf.d.ts +5 -0
- package/dist/perftest/ecs2-perf.js +162 -0
- package/dist/perftest/ecs2-perf.js.map +1 -0
- package/dist/perftest/index.js +8 -3
- package/dist/perftest/index.js.map +1 -1
- package/dist/perftest/perf-test.d.ts +7 -0
- package/dist/perftest/perf-test.js +69 -7
- package/dist/perftest/perf-test.js.map +1 -1
- package/dist/perftest/typed-buffer-perf.d.ts +8 -0
- package/dist/perftest/typed-buffer-perf.js +133 -0
- package/dist/perftest/typed-buffer-perf.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/references/data-lit/package.json +1 -1
- package/references/data-lit-tictactoe/package.json +1 -1
- package/references/data-react/package.json +1 -1
- package/references/data-react-hello/package.json +1 -1
- package/references/data-react-pixie/package.json +1 -1
package/README.md
CHANGED
|
@@ -76,7 +76,7 @@ An `Observable<T>` is a subscription function that you can pass a callback funct
|
|
|
76
76
|
|
|
77
77
|
Your callback function *may* be called back synchronously (before the initial call returns) zero or one times and asynchronously later any number of times.
|
|
78
78
|
|
|
79
|
-
For more information see the [Observable API documentation](https://adobe.github.io/data/)
|
|
79
|
+
For more information see the [Observable API documentation](https://adobe.github.io/data/api/modules/observe.html)
|
|
80
80
|
|
|
81
81
|
### Observable Types
|
|
82
82
|
|
package/dist/cache/data-cache.js
CHANGED
|
@@ -60,12 +60,32 @@ export function createBlobRefAwareDataCache(baseCache = dataCache, blobstore = b
|
|
|
60
60
|
},
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
// Lazy-init the global cache to avoid a top-level await. Rolldown / Vite 8
|
|
64
|
+
// can deadlock when modules with TLA are reachable through a barrel cycle
|
|
65
|
+
// in downstream bundles, so we defer the async work to first use.
|
|
66
|
+
function createGlobalDataCache() {
|
|
67
|
+
let cachePromise;
|
|
68
|
+
const init = () => (cachePromise ??= (async () => {
|
|
69
|
+
const managedPersistentCache = await getManagedPersistentCache("datacache", {
|
|
70
|
+
maximumMemoryEntries: 100,
|
|
71
|
+
maximumStorageEntries: 1000,
|
|
72
|
+
});
|
|
73
|
+
const blobRefAwareDataCache = await createBlobRefAwareDataCache(createDataCache(managedPersistentCache));
|
|
74
|
+
return createExpiringDataCache(blobRefAwareDataCache);
|
|
75
|
+
})());
|
|
76
|
+
return {
|
|
77
|
+
async match(key) {
|
|
78
|
+
return (await init()).match(key);
|
|
79
|
+
},
|
|
80
|
+
async put(key, value, options) {
|
|
81
|
+
return (await init()).put(key, value, options);
|
|
82
|
+
},
|
|
83
|
+
async delete(key) {
|
|
84
|
+
return (await init()).delete(key);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export const dataCache = createGlobalDataCache();
|
|
69
89
|
/**
|
|
70
90
|
* Retrieves a namespaced data cache. Calling it multiple times will return an equivalent cache.
|
|
71
91
|
* Values stored within a data cache generally persist across sessions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-cache.js","sourceRoot":"","sources":["../../src/cache/data-cache.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data-cache.js","sourceRoot":"","sources":["../../src/cache/data-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
-
import { getDataCache } from "./data-cache.js";
|
|
2
|
+
import { dataCache, getDataCache } from "./data-cache.js";
|
|
3
3
|
import { beforeAll, describe, expect, it } from "vitest";
|
|
4
4
|
describe("DataCache", () => {
|
|
5
5
|
beforeAll(() => { });
|
|
6
|
+
it("dataCache is not a top-level await", () => {
|
|
7
|
+
expect(typeof dataCache.then === "undefined");
|
|
8
|
+
});
|
|
9
|
+
it("dataCache is lazily initialized and supports put/match/delete directly", async () => {
|
|
10
|
+
const key = { test: "lazy-init", n: Date.now() };
|
|
11
|
+
const value = { hello: "world" };
|
|
12
|
+
await dataCache.put(key, value);
|
|
13
|
+
expect(await dataCache.match(key)).toEqual(value);
|
|
14
|
+
await dataCache.delete(key);
|
|
15
|
+
expect(await dataCache.match(key)).toBeUndefined();
|
|
16
|
+
});
|
|
6
17
|
it("should allow storing and retrieving values in namespaced/versioned caches", async () => {
|
|
7
18
|
// get a namespaced cache
|
|
8
19
|
const cache = await getDataCache("test:v1");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-cache.test.js","sourceRoot":"","sources":["../../src/cache/data-cache.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-cache.test.js","sourceRoot":"","sources":["../../src/cache/data-cache.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpB,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,OAAQ,SAAiB,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAElD,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;QAE5C,wCAAwC;QACxC,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAElD,0BAA0B;QAC1B,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9B,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,2BAA2B;QAC3B,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,gCAAgC;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAElC,uDAAuD;QACvD,MAAM,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE5E,kFAAkF;QAClF,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE1E,kDAAkD;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAC/D,SAAS,CACV,CAAC;QAEF,oDAAoD;QACpD,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -53,79 +53,83 @@ function binaryDecode(data, length, ctor) {
|
|
|
53
53
|
}
|
|
54
54
|
return new ctor(byteArray.buffer, byteArray.byteOffset, length);
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
allocator
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
56
|
+
// Methods live on the prototype so every numeric column shares one hidden
|
|
57
|
+
// class. This lets V8 monomorphize the IC at hot get/set call sites in tight
|
|
58
|
+
// per-row loops (~20× speedup over the previous closure-per-instance shape).
|
|
59
|
+
class ManagedTypedArrayColumn {
|
|
60
|
+
constructor(ctor, allocator) {
|
|
61
|
+
this.constant = false;
|
|
62
|
+
this.ctor = ctor;
|
|
63
|
+
this.allocator = allocator;
|
|
64
|
+
this.capacity = 16;
|
|
65
|
+
this.array = allocator.allocate(ctor, this.capacity);
|
|
66
|
+
// when the main wasm memory is resized, we need to refresh the array.
|
|
67
|
+
allocator.needsRefresh(() => {
|
|
68
|
+
this.array = allocator.refresh(this.array);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
get native() {
|
|
72
|
+
return this.array;
|
|
73
|
+
}
|
|
74
|
+
get(index) {
|
|
75
|
+
return this.array[index];
|
|
76
|
+
}
|
|
77
|
+
set(index, value) {
|
|
78
|
+
this.array[index] = value;
|
|
79
|
+
}
|
|
80
|
+
move(from, to) {
|
|
81
|
+
this.array[to] = this.array[from];
|
|
82
|
+
}
|
|
83
|
+
slice(start, end) {
|
|
84
|
+
return [...this.array.subarray(start, end)];
|
|
85
|
+
}
|
|
86
|
+
ensureCapacity(newCapacity) {
|
|
87
|
+
this.grow(newCapacity);
|
|
88
|
+
}
|
|
89
|
+
grow(newCapacity) {
|
|
90
|
+
if (newCapacity && newCapacity > this.capacity) {
|
|
91
|
+
this.array = this.allocator.refresh(this.array);
|
|
92
|
+
const oldArray = this.array;
|
|
67
93
|
const growthFactor = 2;
|
|
68
|
-
capacity = Math.max(newCapacity, capacity * growthFactor);
|
|
69
|
-
const newArray = allocator.allocate(ctor, capacity);
|
|
70
|
-
newArray.set(array);
|
|
71
|
-
array = newArray;
|
|
72
|
-
allocator.release(oldArray);
|
|
94
|
+
this.capacity = Math.max(newCapacity, this.capacity * growthFactor);
|
|
95
|
+
const newArray = this.allocator.allocate(this.ctor, this.capacity);
|
|
96
|
+
newArray.set(this.array);
|
|
97
|
+
this.array = newArray;
|
|
98
|
+
this.allocator.release(oldArray);
|
|
73
99
|
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
},
|
|
92
|
-
slice(start, end) {
|
|
93
|
-
return [...array.subarray(start, end)];
|
|
94
|
-
},
|
|
95
|
-
ensureCapacity(newCapacity) {
|
|
96
|
-
grow(newCapacity);
|
|
97
|
-
},
|
|
98
|
-
toJSON(length, allowEncoding = true) {
|
|
99
|
-
const subarray = array.subarray(0, length);
|
|
100
|
-
if (!allowEncoding) {
|
|
101
|
-
return Array.from(subarray);
|
|
100
|
+
}
|
|
101
|
+
toJSON(length, allowEncoding = true) {
|
|
102
|
+
const subarray = this.array.subarray(0, length);
|
|
103
|
+
if (!allowEncoding) {
|
|
104
|
+
return Array.from(subarray);
|
|
105
|
+
}
|
|
106
|
+
const jsonString = JSON.stringify(Array.from(subarray));
|
|
107
|
+
const binaryString = binaryEncode(subarray);
|
|
108
|
+
return binaryString.length < jsonString.length
|
|
109
|
+
? binaryString
|
|
110
|
+
: Array.from(subarray);
|
|
111
|
+
}
|
|
112
|
+
fromJSON(data, length) {
|
|
113
|
+
if (typeof data === "string") {
|
|
114
|
+
const decodedArray = binaryDecode(data, length, this.ctor);
|
|
115
|
+
if (decodedArray.length > this.capacity) {
|
|
116
|
+
this.grow(decodedArray.length);
|
|
102
117
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
},
|
|
109
|
-
fromJSON(data, length) {
|
|
110
|
-
if (typeof data === "string") {
|
|
111
|
-
const decodedArray = binaryDecode(data, length, ctor);
|
|
112
|
-
if (decodedArray.length > capacity) {
|
|
113
|
-
grow(decodedArray.length);
|
|
114
|
-
}
|
|
115
|
-
array.set(decodedArray);
|
|
118
|
+
this.array.set(decodedArray);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
if (!Array.isArray(data)) {
|
|
122
|
+
throw new Error(`Cannot set array to ${data}`);
|
|
116
123
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
throw new Error(`Cannot set array to ${data}`);
|
|
120
|
-
}
|
|
121
|
-
if (data.length > capacity) {
|
|
122
|
-
grow(data.length);
|
|
123
|
-
}
|
|
124
|
-
array.set(data);
|
|
124
|
+
if (data.length > this.capacity) {
|
|
125
|
+
this.grow(data.length);
|
|
125
126
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
this.array.set(data);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function createManagedTypedArray(ctor, allocator) {
|
|
132
|
+
return new ManagedTypedArrayColumn(ctor, allocator);
|
|
129
133
|
}
|
|
130
134
|
export function createManagedArray(s, allocator) {
|
|
131
135
|
if (s.const !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-array.js","sourceRoot":"","sources":["../../src/cache/managed-array.ts"],"names":[],"mappings":"AA6BA,SAAS,0BAA0B,CAAI,KAAQ;IAC7C,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,GAAG,CAAC,MAAc;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,GAAG,CAAC,MAAc,EAAE,MAAS,IAAU,CAAC;QACxC,IAAI,CAAC,KAAa,EAAE,GAAW,IAAU,CAAC;QAC1C,KAAK,CAAC,KAAa,EAAE,OAAe;YAClC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QACD,cAAc,CAAC,SAAiB,IAAI,CAAC;QACrC,MAAM,CAAC,OAAe;YACpB,OAAO,KAAa,CAAC;QACvB,CAAC;QACD,QAAQ,CAAC,IAAU;YACjB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB;IAC9B,MAAM,KAAK,GAAQ,EAAE,CAAC;IACtB,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACpC,GAAG,EAAE,CAAC,KAAa,EAAE,KAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACxD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,cAAc,EAAE,CAAC,SAAiB,EAAE,EAAE,GAAG,CAAC;QAC1C,KAAK,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;QACzE,MAAM,CAAC,MAAc;YACnB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAS,CAAC;QACxC,CAAC;QACD,QAAQ,CAAC,IAAU;YACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAW,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAoB;IACxC,OAAO,IAAI,CACT,MAAM,CAAC,YAAY,CACjB,GAAG,IAAI,UAAU,CACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,UAAU,CACpB,CACF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,MAAc,EACd,IAA2B;IAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAClE,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"managed-array.js","sourceRoot":"","sources":["../../src/cache/managed-array.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,134 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
2
|
import * as TABLE from "../../table/index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import { ensureCapacity } from "../../table/ensure-capacity.js";
|
|
4
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// Specialized insert function per archetype.
|
|
6
|
+
//
|
|
7
|
+
// Why: archetype.insert(rowData) is the hottest write path in the ECS. CPU
|
|
8
|
+
// profiling showed the previous implementation spending ~30 % self-time
|
|
9
|
+
// in the createEntity closure body and another ~10 % in addRow's
|
|
10
|
+
// `for (name in rowData)` loop, on what is logically a sequence of
|
|
11
|
+
// typed-array stores. V8 wasn't inlining because:
|
|
12
|
+
//
|
|
13
|
+
// (a) addRow iterated `rowData` keys with `for...in`, then did a
|
|
14
|
+
// polymorphic `cols[name]` lookup per field;
|
|
15
|
+
// (b) the column reference chain `archetype.columns.id.set(...)` was
|
|
16
|
+
// three property loads + a method call, all on closure-captured
|
|
17
|
+
// `archetype`;
|
|
18
|
+
// (c) entityLocationTable.create(...) took an `{ archetype, row }`
|
|
19
|
+
// object literal, allocated fresh per insert.
|
|
20
|
+
//
|
|
21
|
+
// What we do instead:
|
|
22
|
+
// 1. At archetype-creation time, build the per-component column refs
|
|
23
|
+
// once and bake them into a code-generated insert function as
|
|
24
|
+
// closure constants. The hot path then reads `_color.set(row, …)`
|
|
25
|
+
// where `_color` is a const slot the JIT can fold and inline —
|
|
26
|
+
// identical machine code to a hand-written straight-line insert.
|
|
27
|
+
// 2. The generated body unrolls every column.set call — no `for...in`,
|
|
28
|
+
// no string-keyed lookup, one inlinable typed-array store per
|
|
29
|
+
// component.
|
|
30
|
+
// 3. archetype.rowCount / rowCapacity stay dynamic (we read them off
|
|
31
|
+
// the archetype every call) because they DO change every insert and
|
|
32
|
+
// on grow. The COLUMN REFERENCES are baked because they don't —
|
|
33
|
+
// createTable allocates the column objects once and we never swap
|
|
34
|
+
// them. (TypedBuffer's internal `array` field can grow, but the
|
|
35
|
+
// column object itself is stable.)
|
|
36
|
+
// 4. fromData() Object.assigns over rowCount / rowCapacity / columns
|
|
37
|
+
// when restoring from serialized data. That replaces archetype.columns
|
|
38
|
+
// with the deserialized columns, invalidating the baked refs. We
|
|
39
|
+
// rebuild insertImpl in fromData so the baked refs are always
|
|
40
|
+
// current. In the steady-state hot path (no fromData), the rebuild
|
|
41
|
+
// never runs and the baked refs persist for the archetype's life.
|
|
42
|
+
// 5. SAFE_IDENT gates the codegen: a malformed component name could
|
|
43
|
+
// escape the template into syntax-error or code-injection territory,
|
|
44
|
+
// so any non-identifier name falls back to the generic for-in path.
|
|
45
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
46
|
+
const SAFE_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
47
|
+
const buildSpecializedInsert = (archetypeId, columns, entityLocationTable) => {
|
|
48
|
+
const componentNames = Object.keys(columns);
|
|
49
|
+
if (componentNames.some((n) => !SAFE_IDENT.test(n))) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
// Build two parallel lists in matching order:
|
|
53
|
+
// componentParamNames: parameter names of the *factory* function
|
|
54
|
+
// we generate via `new Function`. Each becomes
|
|
55
|
+
// a local in the factory; the inner `insert`
|
|
56
|
+
// it returns sees them as fast closure
|
|
57
|
+
// constants — V8 treats these like
|
|
58
|
+
// const-folded values rather than property
|
|
59
|
+
// loads.
|
|
60
|
+
// componentParamValues: the actual column refs to hand the factory
|
|
61
|
+
// when we invoke it once per archetype.
|
|
62
|
+
// For non-id columns we prefix the local with `_` to avoid colliding
|
|
63
|
+
// with reserved words or shadowing globals (e.g. a component called
|
|
64
|
+
// `delete`).
|
|
65
|
+
const componentParamNames = [];
|
|
66
|
+
const componentParamValues = [];
|
|
67
|
+
const sets = [];
|
|
68
|
+
for (const name of componentNames) {
|
|
69
|
+
if (name === "id")
|
|
70
|
+
continue;
|
|
71
|
+
const local = `_${name}`;
|
|
72
|
+
componentParamNames.push(local);
|
|
73
|
+
componentParamValues.push(columns[name]);
|
|
74
|
+
sets.push(` ${local}.set(row, rowData.${name});`);
|
|
75
|
+
}
|
|
76
|
+
const factoryBody = `
|
|
77
|
+
// archetypeId, ensureCapacityFn, entityLocationTable, _id, and one
|
|
78
|
+
// _<name> per non-id component are captured here as closure
|
|
79
|
+
// constants. The returned insert function dereferences them as fast
|
|
80
|
+
// local context slots — no property chain on the hot path.
|
|
81
|
+
return function insert(archetype, rowData) {
|
|
82
|
+
// archetype.rowCount / rowCapacity *must* be read from the live
|
|
83
|
+
// archetype every call — both mutate on the hot path (rowCount
|
|
84
|
+
// every insert; rowCapacity on grow).
|
|
85
|
+
if (archetype.rowCapacity <= archetype.rowCount) {
|
|
86
|
+
ensureCapacityFn(archetype, archetype.rowCount + 1);
|
|
87
|
+
}
|
|
88
|
+
const row = archetype.rowCount;
|
|
89
|
+
${sets.join("\n")}
|
|
90
|
+
// entityLocationTable.create takes an object today — the alloc
|
|
91
|
+
// is small and V8's escape analysis usually scalar-replaces it.
|
|
92
|
+
// If that ever surfaces in a future profile, change the
|
|
93
|
+
// EntityLocationTable.create signature to (archetypeId, row).
|
|
94
|
+
const entity = entityLocationTable.create({ archetype: archetypeId, row });
|
|
95
|
+
_id.set(row, entity);
|
|
96
|
+
archetype.rowCount = row + 1;
|
|
97
|
+
return entity;
|
|
98
|
+
};
|
|
99
|
+
`;
|
|
100
|
+
// eslint-disable-next-line no-new-func
|
|
101
|
+
const factory = new Function("archetypeId", "ensureCapacityFn", "entityLocationTable", "_id", ...componentParamNames, factoryBody);
|
|
102
|
+
return factory(archetypeId, ensureCapacity, entityLocationTable, columns.id, ...componentParamValues);
|
|
103
|
+
};
|
|
104
|
+
// Generic fallback for archetypes whose component names contain
|
|
105
|
+
// non-identifier characters (so we can't safely embed them into generated
|
|
106
|
+
// code). Same logic, just done via property-keyed access on the live
|
|
107
|
+
// archetype.
|
|
108
|
+
const buildGenericInsert = (archetypeId, entityLocationTable) => {
|
|
109
|
+
return (archetype, rowData) => {
|
|
7
110
|
const row = TABLE.addRow(archetype, rowData);
|
|
8
|
-
|
|
9
|
-
const entity = entityLocationTable.create({ archetype: archetype.id, row });
|
|
10
|
-
// set the entity id for the row (since it wasn't present in the row data)
|
|
111
|
+
const entity = entityLocationTable.create({ archetype: archetypeId, row });
|
|
11
112
|
archetype.columns.id.set(row, entity);
|
|
12
113
|
return entity;
|
|
13
114
|
};
|
|
115
|
+
};
|
|
116
|
+
export const createArchetype = (components, id, entityLocationTable) => {
|
|
117
|
+
const table = TABLE.createTable(components);
|
|
14
118
|
const componentSet = new Set(Object.keys(components));
|
|
119
|
+
// Mutable so we can rebuild it after fromData replaces columns. In the
|
|
120
|
+
// hot path (no fromData) this stays the value built once at creation.
|
|
121
|
+
let insertImpl;
|
|
122
|
+
const refreshInsertImpl = () => {
|
|
123
|
+
insertImpl =
|
|
124
|
+
buildSpecializedInsert(id, archetype.columns, entityLocationTable) ??
|
|
125
|
+
buildGenericInsert(id, entityLocationTable);
|
|
126
|
+
};
|
|
127
|
+
const createEntity = (rowData) => {
|
|
128
|
+
// archetype is closure-captured here. By the time createEntity
|
|
129
|
+
// actually runs the const has been initialized.
|
|
130
|
+
return insertImpl(archetype, rowData);
|
|
131
|
+
};
|
|
15
132
|
const archetype = {
|
|
16
133
|
id,
|
|
17
134
|
...table,
|
|
@@ -24,9 +141,16 @@ export const createArchetype = (components, id, entityLocationTable) => {
|
|
|
24
141
|
}),
|
|
25
142
|
fromData: (data) => {
|
|
26
143
|
Object.assign(archetype, data);
|
|
144
|
+
// Restoring archetype state replaces archetype.columns with the
|
|
145
|
+
// deserialized columns object. Rebuild insertImpl so the baked
|
|
146
|
+
// column refs match the new live columns.
|
|
147
|
+
refreshInsertImpl();
|
|
27
148
|
// component set cannot be changed by this as the archetype components should be the same.
|
|
28
149
|
}
|
|
29
150
|
};
|
|
151
|
+
// Initial build, after `archetype` is in scope so the specialized
|
|
152
|
+
// insert closes over the right columns.
|
|
153
|
+
refreshInsertImpl();
|
|
30
154
|
return archetype;
|
|
31
155
|
};
|
|
32
156
|
//# sourceMappingURL=create-archetype.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-archetype.js","sourceRoot":"","sources":["../../../src/ecs/archetype/create-archetype.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-archetype.js","sourceRoot":"","sources":["../../../src/ecs/archetype/create-archetype.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { TypedArrayConstructor } from "../../types/typed-array-constructer.js";
|
|
2
|
-
export declare const getByteSize: (typedArrayConstructor: TypedArrayConstructor) =>
|
|
2
|
+
export declare const getByteSize: (typedArrayConstructor: TypedArrayConstructor) => 4 | 1 | 2 | 8;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare const ecs1: {
|
|
2
|
+
create: {
|
|
3
|
+
setup: (n: number) => Promise<void>;
|
|
4
|
+
run: () => void;
|
|
5
|
+
cleanup: () => Promise<void>;
|
|
6
|
+
type: "create";
|
|
7
|
+
};
|
|
8
|
+
create_batch: {
|
|
9
|
+
setup: (n: number) => Promise<void>;
|
|
10
|
+
run: () => void;
|
|
11
|
+
cleanup: () => Promise<void>;
|
|
12
|
+
type: "create";
|
|
13
|
+
};
|
|
14
|
+
move_column: {
|
|
15
|
+
setup: (n: number) => Promise<void>;
|
|
16
|
+
run: () => void;
|
|
17
|
+
cleanup: () => Promise<void>;
|
|
18
|
+
getVisibleEnabledPositions: () => number[];
|
|
19
|
+
type: "move";
|
|
20
|
+
startN: number;
|
|
21
|
+
};
|
|
22
|
+
move_native: {
|
|
23
|
+
setup: (n: number) => Promise<void>;
|
|
24
|
+
run: () => void;
|
|
25
|
+
cleanup: () => Promise<void>;
|
|
26
|
+
getVisibleEnabledPositions: () => number[];
|
|
27
|
+
type: "move";
|
|
28
|
+
startN: number;
|
|
29
|
+
};
|
|
30
|
+
move_wasm: {
|
|
31
|
+
setup: (n: number) => Promise<void>;
|
|
32
|
+
run: () => void;
|
|
33
|
+
cleanup: () => Promise<void>;
|
|
34
|
+
getVisibleEnabledPositions: () => number[];
|
|
35
|
+
type: "move";
|
|
36
|
+
startN: number;
|
|
37
|
+
};
|
|
38
|
+
move_wasm_simd4: {
|
|
39
|
+
setup: (n: number) => Promise<void>;
|
|
40
|
+
run: () => void;
|
|
41
|
+
cleanup: () => Promise<void>;
|
|
42
|
+
getVisibleEnabledPositions: () => number[];
|
|
43
|
+
type: "move";
|
|
44
|
+
startN: number;
|
|
45
|
+
};
|
|
46
|
+
move_wasm_simd4_unrolled: {
|
|
47
|
+
setup: (n: number) => Promise<void>;
|
|
48
|
+
run: () => void;
|
|
49
|
+
cleanup: () => Promise<void>;
|
|
50
|
+
getVisibleEnabledPositions: () => number[];
|
|
51
|
+
type: "move";
|
|
52
|
+
startN: number;
|
|
53
|
+
};
|
|
54
|
+
};
|