perf: faster remembered entities

This commit is contained in:
cha0s 2019-05-08 17:50:58 -05:00
parent 9e7666de53
commit 31f2883292

View File

@ -25,7 +25,8 @@ export class Informed extends decorate(Trait) {
constructor(entity, params, state) {
super(entity, params, state);
this._packer = new Packer();
this._rememberedEntities = {};
this._rememberedEntities = [];
this._rememberedUuids = [];
this._socket = undefined;
this._state = I.Map();
}
@ -35,7 +36,8 @@ export class Informed extends decorate(Trait) {
delete this._socket.entity;
delete this._socket;
}
this._rememberedEntities = {};
this._rememberedEntities = [];
this._rememberedUuids = [];
this._state = this._state.clear();
}
@ -103,16 +105,17 @@ export class Informed extends decorate(Trait) {
steps = steps.withMutations((steps) => {
const iterator = adds.values();
for (const add of iterator) {
// Remember the entity.
// Entity we remember?.
const parts = add.get('parts');
const layerId = parts[3];
const uuid = parts[5];
if (!(uuid in this._rememberedEntities)) {
const index = this._rememberedUuids.indexOf(uuid);
if (-1 === index) {
continue;
}
const rememberedEntity = this._rememberedEntities[uuid].entity;
const rememberedEntity = this._rememberedEntities[index].entity;
// Reset remembrance timeout.
this._rememberedEntities[uuid].rememberFor = 60;
this._rememberedEntities[index].rememberFor = 60;
// Take a diff from what the client remembers to now.
const currentState = state.getIn(
['room', 'layers', layerId, 'entityList', uuid]
@ -142,13 +145,16 @@ export class Informed extends decorate(Trait) {
}
const parts = step.get('parts');
const uuid = parts[5];
return !(uuid in this._rememberedEntities);
const index = this._rememberedUuids.indexOf(uuid);
return -1 === index;
});
// Forget all remembered entities.
adds.forEach((step) => {
const parts = step.get('parts');
const uuid = parts[5];
delete this._rememberedEntities[uuid];
const index = this._rememberedUuids.indexOf(uuid);
this._rememberedEntities.splice(index, 1);
this._rememberedUuids.splice(index, 1);
});
return steps;
}
@ -172,11 +178,12 @@ export class Informed extends decorate(Trait) {
if (!remembered) {
return;
}
this._rememberedEntities[uuid] = {
this._rememberedUuids.push(uuid);
this._rememberedEntities.push({
entity: remembered,
// Remember entities for one minute.
rememeberFor: 60,
};
});
// Add overrides.
const overrides = this.entityOverrides(
removal.get('path'),
@ -194,7 +201,8 @@ export class Informed extends decorate(Trait) {
}
const parts = step.get('parts');
const uuid = parts[5];
return !(uuid in this._rememberedEntities);
const index = this._rememberedUuids.indexOf(uuid);
return -1 === index;
});
}
@ -269,13 +277,19 @@ export class Informed extends decorate(Trait) {
}
tick(elapsed) {
const rememberedEntities = this._rememberedEntities;
for (const uuid in rememberedEntities) {
const rememberFor = rememberedEntities[uuid].rememberFor -= elapsed;
if (rememberFor <= 0) {
delete rememberedEntities[uuid];
const removeUuids = [];
for (let i = 0; i < this._rememberedEntities.length; i++) {
this._rememberedEntities[i].rememberFor -= elapsed;
if (this._rememberedEntities[i].rememberFor <= 0) {
removeUuids.push(this._rememberedUuids[i]);
}
}
for (let i = 0; i < removeUuids.length; i++) {
const uuid = removeUuids[i];
const index = this._rememberedUuids.indexOf(uuid);
this._rememberedEntities.splice(index, 1);
this._rememberedUuids.splice(index, 1);
}
}
}