Skip to content

Commit 10391af

Browse files
committed
asd
1 parent ec8c8e4 commit 10391af

File tree

6 files changed

+60
-46
lines changed

6 files changed

+60
-46
lines changed

packages/core/src/entity/entity.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ export function createEntity(world: World, ...traits: ConfigurableTrait[]): Enti
1515
const ctx = world[$internal];
1616
const entity = allocateEntity(ctx.entityIndex);
1717

18-
for (const query of ctx.notQueries) {
18+
const notQueries = ctx.notQueries;
19+
for (let i = 0; i < notQueries.length; i++) {
20+
const query = notQueries[i];
1921
const match = query.check(world, entity);
2022
if (match) query.add(entity);
2123
// Reset all tracking bitmasks for the query.

packages/core/src/query/modifiers/changed.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ export function setChanged(world: World, entity: Entity, trait: Trait) {
3333
if (!hasTrait(world, entity, trait)) return;
3434

3535
// Register the trait if it's not already registered.
36-
if (!ctx.traitData.has(trait)) registerTrait(world, trait);
37-
const data = ctx.traitData.get(trait)!;
36+
const tid = trait[$internal].id;
37+
if (!ctx.traitData[tid]) registerTrait(world, trait);
38+
const data = ctx.traitData[tid]!;
3839

3940
// Mark the trait as changed for the entity.
4041
// This is used for filling initial values for Changed modifiers.
41-
for (const changedMask of ctx.changedMasks.values()) {
42-
const eid = getEntityId(entity);
43-
const data = ctx.traitData.get(trait)!;
44-
const { generationId, bitflag } = data;
42+
const eid = getEntityId(entity);
43+
const { generationId, bitflag } = data;
4544

45+
for (const changedMask of ctx.changedMasks.values()) {
4646
// Ensure the generation array exists
4747
if (!changedMask[generationId]) {
4848
changedMask[generationId] = [];
@@ -58,7 +58,9 @@ export function setChanged(world: World, entity: Entity, trait: Trait) {
5858
}
5959

6060
// Update queries.
61-
for (const query of data.queries) {
61+
const queries = data.queries;
62+
for (let qi = 0; qi < queries.length; qi++) {
63+
const query = queries[qi];
6264
// If the query has no changed modifiers, continue.
6365
if (!query.hasChangedModifiers) continue;
6466
// If the trait is not part of a Changed modifier in this query, continue.

packages/core/src/query/query.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ export function runQuery<T extends QueryParameter[]>(world: World, query: Query<
2020
const entityIndex = ctx.entityIndex;
2121

2222
// Build Entity[] from BitSet by looking up packed entities via entityIndex.
23-
const entities: Entity[] = [];
23+
const dense = entityIndex.dense;
24+
const sparse = entityIndex.sparse;
25+
const entities: Entity[] = new Array(query.entities.count);
26+
let ei = 0;
2427
query.entities.forEach((eid) => {
25-
entities.push(entityIndex.dense[entityIndex.sparse[eid]] as Entity);
28+
entities[ei++] = dense[sparse[eid]] as Entity;
2629
});
2730

2831
// Clear so it can accumulate again.
@@ -227,20 +230,20 @@ export function createQuery<T extends QueryParameter[]>(world: World, parameters
227230
// Register traits if they don't exist.
228231
for (let j = 0; j < traits.length; j++) {
229232
const trait = traits[j];
230-
if (!ctx.traitData.has(trait)) registerTrait(world, trait);
233+
if (!ctx.traitData[trait[$internal].id]) registerTrait(world, trait);
231234
}
232235

233236
if (parameter.type === 'not') {
234-
query.traitData.forbidden.push(...traits.map((trait) => ctx.traitData.get(trait)!));
237+
query.traitData.forbidden.push(...traits.map((trait) => ctx.traitData[trait[$internal].id]!));
235238
}
236239

237240
if (parameter.type === 'or') {
238-
query.traitData.or.push(...traits.map((trait) => ctx.traitData.get(trait)!));
241+
query.traitData.or.push(...traits.map((trait) => ctx.traitData[trait[$internal].id]!));
239242
}
240243

241244
if (parameter.type.includes('added')) {
242245
for (const trait of traits) {
243-
const data = ctx.traitData.get(trait)!;
246+
const data = ctx.traitData[trait[$internal].id]!;
244247
query.traitData.added.push(data);
245248
query.traits.push(trait);
246249
}
@@ -257,7 +260,7 @@ export function createQuery<T extends QueryParameter[]>(world: World, parameters
257260

258261
if (parameter.type.includes('removed')) {
259262
for (const trait of traits) {
260-
const data = ctx.traitData.get(trait)!;
263+
const data = ctx.traitData[trait[$internal].id]!;
261264
query.traitData.removed.push(data);
262265
query.traits.push(trait);
263266
}
@@ -275,7 +278,7 @@ export function createQuery<T extends QueryParameter[]>(world: World, parameters
275278
if (parameter.type.includes('changed')) {
276279
for (const trait of traits) {
277280
query.changedTraits.add(trait);
278-
const data = ctx.traitData.get(trait)!;
281+
const data = ctx.traitData[trait[$internal].id]!;
279282
query.traitData.changed.push(data);
280283
query.traits.push(trait);
281284
query.hasChangedModifiers = true;
@@ -292,14 +295,15 @@ export function createQuery<T extends QueryParameter[]>(world: World, parameters
292295
}
293296
} else {
294297
const trait = parameter as Trait;
295-
if (!ctx.traitData.has(trait)) registerTrait(world, trait);
296-
query.traitData.required.push(ctx.traitData.get(trait)!);
298+
const tid = trait[$internal].id;
299+
if (!ctx.traitData[tid]) registerTrait(world, trait);
300+
query.traitData.required.push(ctx.traitData[tid]!);
297301
query.traits.push(trait);
298302
}
299303
}
300304

301305
// Add IsExcluded to the forbidden list.
302-
query.traitData.forbidden.push(ctx.traitData.get(IsExcluded)!);
306+
query.traitData.forbidden.push(ctx.traitData[IsExcluded[$internal].id]!);
303307

304308
query.traitData.all = [
305309
...query.traitData.required,
@@ -366,12 +370,12 @@ export function createQuery<T extends QueryParameter[]>(world: World, parameters
366370
ctx.queriesHashMap.set(query.hash, query);
367371

368372
// Add query to each trait instance.
369-
query.traitData.all.forEach((instance) => {
370-
instance.queries.add(query);
371-
});
373+
for (let i = 0; i < query.traitData.all.length; i++) {
374+
query.traitData.all[i].queries.push(query);
375+
}
372376

373377
// Add query instance to the world's not-query store.
374-
if (query.traitData.forbidden.length > 0) ctx.notQueries.add(query);
378+
if (query.traitData.forbidden.length > 0) ctx.notQueries.push(query);
375379

376380
// Populate the query with tracking parameters.
377381
if (trackingParams.length > 0) {

packages/core/src/trait/trait.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ export function registerTrait(world: World, trait: Trait) {
7575
bitflag: ctx.bitflag,
7676
trait,
7777
store: traitCtx.createStore(),
78-
queries: new Set(),
79-
notQueries: new Set(),
78+
queries: [],
79+
notQueries: [],
8080
schema: trait.schema,
8181
entityBitSet: new BitSet(),
8282
changeSubscriptions: new Set(),
@@ -88,7 +88,7 @@ export function registerTrait(world: World, trait: Trait) {
8888
traitCtx.stores[world.id] = data.store;
8989

9090
// Add trait to the world.
91-
ctx.traitData.set(trait, data);
91+
ctx.traitData[traitCtx.id] = data;
9292
world.traits.add(trait);
9393

9494
// Increment the bitflag used for the trait.
@@ -115,9 +115,10 @@ export function addTrait(world: World, entity: Entity, ...traits: ConfigurableTr
115115
const traitCtx = trait[$internal];
116116

117117
// Register the trait if it's not already registered.
118-
if (!ctx.traitData.has(trait)) registerTrait(world, trait);
118+
const tid = traitCtx.id;
119+
if (!ctx.traitData[tid]) registerTrait(world, trait);
119120

120-
const data = ctx.traitData.get(trait)!;
121+
const data = ctx.traitData[tid]!;
121122
const { generationId, bitflag, queries } = data;
122123

123124
const eid = getEntityId(entity);
@@ -133,7 +134,8 @@ export function addTrait(world: World, entity: Entity, ...traits: ConfigurableTr
133134

134135
queryEvent.type = 'add';
135136
queryEvent.traitData = data;
136-
for (const query of queries) {
137+
for (let qi = 0; qi < queries.length; qi++) {
138+
const query = queries[qi];
137139
query.toRemove.remove(eid);
138140
const match = query.check(world, entity, queryEvent);
139141
if (match) query.add(entity);
@@ -200,7 +202,7 @@ export function removeTrait(world: World, entity: Entity, ...traits: Trait[]) {
200202
// Exit early if the entity doesn't have the trait.
201203
if (!hasTrait(world, entity, trait)) continue;
202204

203-
const data = ctx.traitData.get(trait)!;
205+
const data = ctx.traitData[traitCtx.id]!;
204206
const { generationId, bitflag, queries } = data;
205207

206208
// Call remove subscriptions before removing the trait.
@@ -219,7 +221,8 @@ export function removeTrait(world: World, entity: Entity, ...traits: Trait[]) {
219221

220222
queryEvent.type = 'remove';
221223
queryEvent.traitData = data;
222-
for (const query of queries) {
224+
for (let qi = 0; qi < queries.length; qi++) {
225+
const query = queries[qi];
223226
const match = query.check(world, entity, queryEvent);
224227
if (match) query.add(entity);
225228
else query.remove(world, entity);
@@ -267,7 +270,7 @@ export function removeTrait(world: World, entity: Entity, ...traits: Trait[]) {
267270

268271
export /* @inline @pure */ function hasTrait(world: World, entity: Entity, trait: Trait): boolean {
269272
const ctx = world[$internal];
270-
const data = ctx.traitData.get(trait);
273+
const data = ctx.traitData[trait[$internal].id];
271274
if (!data) return false;
272275

273276
const { generationId, bitflag } = data;
@@ -282,7 +285,7 @@ export /* @inline @pure */ function getStore<C extends Trait = Trait>(
282285
trait: C
283286
): ExtractStore<C> {
284287
const ctx = world[$internal];
285-
const data = ctx.traitData.get(trait)!;
288+
const data = ctx.traitData[trait[$internal].id]!;
286289
return data.store as ExtractStore<C>;
287290
}
288291

packages/core/src/trait/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ export interface TraitData<T extends Trait = Trait, S extends Schema = ExtractSc
125125
bitflag: number;
126126
trait: Trait;
127127
store: Store<S>;
128-
queries: Set<Query>;
129-
notQueries: Set<Query>;
128+
queries: Query[];
129+
notQueries: Query[];
130130
schema: S;
131131
entityBitSet: BitSet;
132132
changeSubscriptions: Set<(entity: Entity) => void>;

packages/core/src/world/world.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ export class World {
4040
entityMasks: [new Uint32Array(1024)] as Uint32Array[],
4141
entityTraits: new Map<number, Set<Trait>>(),
4242
bitflag: 1,
43-
traitData: new Map<Trait, TraitData>(),
43+
traitData: [] as (TraitData | undefined)[],
4444
queries: new Set<Query>(),
4545
queriesHashMap: new Map<string, Query>(),
46-
notQueries: new Set<Query>(),
46+
notQueries: [] as Query[],
4747
dirtyQueries: new Set<Query>(),
4848
relationTargetEntities: new Set<RelationTarget>(),
4949
dirtyMasks: new Map<number, number[][]>(),
@@ -92,7 +92,7 @@ export class World {
9292
}
9393

9494
// Register system traits.
95-
if (!ctx.traitData.has(IsExcluded)) registerTrait(this, IsExcluded);
95+
if (!ctx.traitData[IsExcluded[$internal].id]) registerTrait(this, IsExcluded);
9696

9797
// Create cached queries.
9898
for (const [hash, parameters] of universe.cachedQueries) {
@@ -162,13 +162,13 @@ export class World {
162162
ctx.entityMasks = [new Uint32Array(1024)];
163163
ctx.bitflag = 1;
164164

165-
ctx.traitData.clear();
165+
ctx.traitData.length = 0;
166166
this.traits.clear();
167167

168168
ctx.queries.clear();
169169
ctx.queriesHashMap.clear();
170170
ctx.dirtyQueries.clear();
171-
ctx.notQueries.clear();
171+
ctx.notQueries.length = 0;
172172

173173
ctx.relationTargetEntities.clear();
174174

@@ -217,11 +217,12 @@ export class World {
217217

218218
onAdd<T extends Trait>(trait: T, callback: (entity: Entity) => void): QueryUnsubscriber {
219219
const ctx = this[$internal];
220-
let data = ctx.traitData.get(trait)!;
220+
const tid = trait[$internal].id;
221+
let data = ctx.traitData[tid];
221222

222223
if (!data) {
223224
registerTrait(this, trait);
224-
data = ctx.traitData.get(trait)!;
225+
data = ctx.traitData[tid]!;
225226
}
226227

227228
data.addSubscriptions.add(callback);
@@ -295,11 +296,12 @@ export class World {
295296

296297
onRemove<T extends Trait>(trait: T, callback: (entity: Entity) => void): QueryUnsubscriber {
297298
const ctx = this[$internal];
298-
let data = ctx.traitData.get(trait)!;
299+
const tid = trait[$internal].id;
300+
let data = ctx.traitData[tid];
299301

300302
if (!data) {
301303
registerTrait(this, trait);
302-
data = ctx.traitData.get(trait)!;
304+
data = ctx.traitData[tid]!;
303305
}
304306

305307
data.removeSubscriptions.add(callback);
@@ -311,9 +313,10 @@ export class World {
311313
const ctx = this[$internal];
312314

313315
// Register the trait if it's not already registered.
314-
if (!ctx.traitData.has(trait)) registerTrait(this, trait);
316+
const tid = trait[$internal].id;
317+
if (!ctx.traitData[tid]) registerTrait(this, trait);
315318

316-
const data = ctx.traitData.get(trait)!;
319+
const data = ctx.traitData[tid]!;
317320
data.changeSubscriptions.add(callback);
318321

319322
// Used by auto change detection to know which traits to track.

0 commit comments

Comments
 (0)