@colyseus/schema 5.0.11 → 5.0.13
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/build/Metadata.d.ts +20 -12
- package/build/annotations.d.ts +23 -10
- package/build/codegen/cli.cjs +615 -204
- package/build/codegen/cli.cjs.map +1 -1
- package/build/codegen/languages/dart.d.ts +20 -0
- package/build/codegen/types.d.ts +20 -0
- package/build/decoder/Resync.d.ts +3 -3
- package/build/encoder/ChangeTree.d.ts +25 -9
- package/build/encoder/EncodeDescriptor.d.ts +11 -12
- package/build/encoder/StateView.d.ts +26 -2
- package/build/encoder/changeTree/inheritedFlags.d.ts +1 -1
- package/build/encoder/changeTree/parentChain.d.ts +9 -0
- package/build/encoder/streaming.d.ts +7 -0
- package/build/index.cjs +449 -233
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +449 -233
- package/build/index.mjs +448 -232
- package/build/index.mjs.map +1 -1
- package/build/types/builder.d.ts +31 -22
- package/build/types/custom/ArraySchema.d.ts +17 -0
- package/build/types/custom/StreamSchema.d.ts +1 -1
- package/build/types/symbols.d.ts +4 -10
- package/package.json +1 -1
- package/src/Metadata.ts +58 -31
- package/src/annotations.ts +56 -32
- package/src/codegen/api.ts +2 -1
- package/src/codegen/languages/c.ts +21 -3
- package/src/codegen/languages/csharp.ts +7 -1
- package/src/codegen/languages/dart.ts +274 -0
- package/src/codegen/languages/haxe.ts +7 -1
- package/src/codegen/languages/lua.ts +16 -4
- package/src/codegen/languages/ts.ts +5 -0
- package/src/codegen/parser.ts +97 -3
- package/src/codegen/types.ts +24 -0
- package/src/decoder/Resync.ts +8 -8
- package/src/encoder/ChangeRecorder.ts +1 -1
- package/src/encoder/ChangeTree.ts +46 -26
- package/src/encoder/EncodeDescriptor.ts +17 -38
- package/src/encoder/EncodeOperation.ts +3 -1
- package/src/encoder/Encoder.ts +97 -21
- package/src/encoder/Root.ts +18 -20
- package/src/encoder/StateView.ts +102 -12
- package/src/encoder/changeTree/inheritedFlags.ts +10 -10
- package/src/encoder/changeTree/liveIteration.ts +9 -9
- package/src/encoder/changeTree/parentChain.ts +29 -0
- package/src/encoder/streaming.ts +8 -0
- package/src/encoding/spec.ts +1 -1
- package/src/index.ts +2 -2
- package/src/types/builder.ts +35 -31
- package/src/types/custom/ArraySchema.ts +40 -1
- package/src/types/custom/StreamSchema.ts +1 -1
- package/src/types/symbols.ts +4 -11
- package/src/bench_bloat.ts +0 -173
- package/src/bench_churn.ts +0 -121
- package/src/bench_decode.ts +0 -221
- package/src/bench_decode_mem.ts +0 -165
- package/src/bench_encode.ts +0 -108
- package/src/bench_init.ts +0 -150
- package/src/bench_static.ts +0 -109
- package/src/bench_stream.ts +0 -295
- package/src/bench_view_cmp.ts +0 -142
package/src/bench_view_cmp.ts
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bench_view_cmp.ts — StateView-path counterpart to bench_bloat.ts.
|
|
3
|
-
*
|
|
4
|
-
* Same entity layout (1000 players × Position × 5 scores) but with N
|
|
5
|
-
* StateViews subscribing to a @view-tagged secret field on each player.
|
|
6
|
-
* Measures per-tick encode throughput under view-filtered fanout.
|
|
7
|
-
*
|
|
8
|
-
* Run: npx tsx --tsconfig tsconfig.test.json --expose-gc src/bench_view_cmp.ts
|
|
9
|
-
*/
|
|
10
|
-
import { Encoder, Schema, type, view, MapSchema, ArraySchema, StateView } from "./index";
|
|
11
|
-
|
|
12
|
-
class Position extends Schema {
|
|
13
|
-
@type("number") x: number = 0;
|
|
14
|
-
@type("number") y: number = 0;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
class Player extends Schema {
|
|
18
|
-
@type("string") name: string = "";
|
|
19
|
-
@type(Position) position = new Position();
|
|
20
|
-
@type(["number"]) scores = new ArraySchema<number>();
|
|
21
|
-
@view() @type("uint32") secret: number = 0;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
class State extends Schema {
|
|
25
|
-
@type({ map: Player }) players = new MapSchema<Player>();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const N_PLAYERS = 1000;
|
|
29
|
-
const N_CLIENTS = 10;
|
|
30
|
-
|
|
31
|
-
// ─── Setup ─────────────────────────────────────────────────────────────
|
|
32
|
-
|
|
33
|
-
globalThis.gc?.();
|
|
34
|
-
const heapBefore = process.memoryUsage().heapUsed;
|
|
35
|
-
|
|
36
|
-
const state = new State();
|
|
37
|
-
const encoder = new Encoder(state);
|
|
38
|
-
Encoder.BUFFER_SIZE = 256 * 1024;
|
|
39
|
-
|
|
40
|
-
for (let i = 0; i < N_PLAYERS; i++) {
|
|
41
|
-
const p = new Player();
|
|
42
|
-
p.name = `P${i}`;
|
|
43
|
-
p.position.x = i;
|
|
44
|
-
p.position.y = i;
|
|
45
|
-
for (let j = 0; j < 5; j++) p.scores.push(j);
|
|
46
|
-
p.secret = i;
|
|
47
|
-
state.players.set(`p${i}`, p);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
globalThis.gc?.();
|
|
51
|
-
const heapAfter = process.memoryUsage().heapUsed;
|
|
52
|
-
console.log(`Heap (${N_PLAYERS} players): ${((heapAfter - heapBefore) / 1024 / 1024).toFixed(2)} MB`);
|
|
53
|
-
|
|
54
|
-
// Subscribe N clients, each to every player.
|
|
55
|
-
const views: StateView[] = [];
|
|
56
|
-
for (let c = 0; c < N_CLIENTS; c++) {
|
|
57
|
-
const v = new StateView();
|
|
58
|
-
for (let i = 0; i < N_PLAYERS; i++) {
|
|
59
|
-
v.add(state.players.get(`p${i}`)!);
|
|
60
|
-
}
|
|
61
|
-
views.push(v);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Bootstrap full encode.
|
|
65
|
-
encoder.encodeAll();
|
|
66
|
-
for (const v of views) {
|
|
67
|
-
const it = { offset: 0 };
|
|
68
|
-
encoder.encodeAll(it);
|
|
69
|
-
encoder.encodeAllView(v, it.offset, it);
|
|
70
|
-
}
|
|
71
|
-
encoder.discardChanges();
|
|
72
|
-
|
|
73
|
-
// ─── 1. 10-mutation ticks ──────────────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
{
|
|
76
|
-
const iterations = 2000;
|
|
77
|
-
const start = performance.now();
|
|
78
|
-
for (let i = 0; i < iterations; i++) {
|
|
79
|
-
for (let j = 0; j < 10; j++) {
|
|
80
|
-
const p = state.players.get(`p${j}`)!;
|
|
81
|
-
p.position.x++;
|
|
82
|
-
p.position.y++;
|
|
83
|
-
}
|
|
84
|
-
const it = { offset: 0 };
|
|
85
|
-
encoder.encode(it);
|
|
86
|
-
const sharedOffset = it.offset;
|
|
87
|
-
for (const v of views) encoder.encodeView(v, sharedOffset, it);
|
|
88
|
-
encoder.discardChanges();
|
|
89
|
-
}
|
|
90
|
-
const elapsed = performance.now() - start;
|
|
91
|
-
console.log(
|
|
92
|
-
`${iterations} ticks × (10 mutations, shared + ${N_CLIENTS} views): ` +
|
|
93
|
-
`${elapsed.toFixed(1)}ms total (${(elapsed / iterations).toFixed(4)}ms/tick)`,
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ─── 2. 100-mutation ticks ─────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
{
|
|
100
|
-
const iterations = 500;
|
|
101
|
-
const start = performance.now();
|
|
102
|
-
for (let i = 0; i < iterations; i++) {
|
|
103
|
-
for (let j = 0; j < 100; j++) {
|
|
104
|
-
const p = state.players.get(`p${j}`)!;
|
|
105
|
-
p.position.x++;
|
|
106
|
-
p.position.y++;
|
|
107
|
-
}
|
|
108
|
-
const it = { offset: 0 };
|
|
109
|
-
encoder.encode(it);
|
|
110
|
-
const sharedOffset = it.offset;
|
|
111
|
-
for (const v of views) encoder.encodeView(v, sharedOffset, it);
|
|
112
|
-
encoder.discardChanges();
|
|
113
|
-
}
|
|
114
|
-
const elapsed = performance.now() - start;
|
|
115
|
-
console.log(
|
|
116
|
-
`${iterations} ticks × (100 mutations, shared + ${N_CLIENTS} views): ` +
|
|
117
|
-
`${elapsed.toFixed(1)}ms total (${(elapsed / iterations).toFixed(3)}ms/tick)`,
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ─── 3. View-tagged field mutations (exercises per-view filtering) ─────
|
|
122
|
-
|
|
123
|
-
{
|
|
124
|
-
const iterations = 500;
|
|
125
|
-
const start = performance.now();
|
|
126
|
-
for (let i = 0; i < iterations; i++) {
|
|
127
|
-
for (let j = 0; j < 100; j++) {
|
|
128
|
-
const p = state.players.get(`p${j}`)!;
|
|
129
|
-
p.secret = (p.secret + 1) >>> 0;
|
|
130
|
-
}
|
|
131
|
-
const it = { offset: 0 };
|
|
132
|
-
encoder.encode(it);
|
|
133
|
-
const sharedOffset = it.offset;
|
|
134
|
-
for (const v of views) encoder.encodeView(v, sharedOffset, it);
|
|
135
|
-
encoder.discardChanges();
|
|
136
|
-
}
|
|
137
|
-
const elapsed = performance.now() - start;
|
|
138
|
-
console.log(
|
|
139
|
-
`${iterations} ticks × (100 @view-field mutations, shared + ${N_CLIENTS} views): ` +
|
|
140
|
-
`${elapsed.toFixed(1)}ms total (${(elapsed / iterations).toFixed(3)}ms/tick)`,
|
|
141
|
-
);
|
|
142
|
-
}
|