1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-03-02 03:39:21 +00:00

Improve performance by getting rid of instanceof

This commit is contained in:
tobspr
2020-06-27 10:38:11 +02:00
parent d8bf4f9cd8
commit 419401b9be
21 changed files with 239 additions and 199 deletions

View File

@@ -37,12 +37,7 @@ export class EnergyGeneratorComponent extends Component {
* @param {BaseItem} item
*/
tryTakeItem(item) {
if (!(item instanceof ShapeItem)) {
// Not a shape
return false;
}
if (item.definition.getHash() !== this.requiredKey) {
if (/** @type {ShapeItem} */ (item).definition.getHash() !== this.requiredKey) {
// Not our shape
return false;
}

View File

@@ -1,23 +1,12 @@
import { Component } from "../component";
import { Vector, enumDirection, enumInvertedDirections } from "../../core/vector";
import { BaseItem } from "../base_item";
import { ShapeItem } from "../items/shape_item";
import { ColorItem } from "../items/color_item";
import { enumDirection, enumInvertedDirections, Vector } from "../../core/vector";
import { types } from "../../savegame/serialization";
/**
* @enum {string?}
*/
export const enumItemAcceptorItemFilter = {
shape: "shape",
color: "color",
none: null,
};
import { BaseItem, enumItemType } from "../base_item";
import { Component } from "../component";
/** @typedef {{
* pos: Vector,
* directions: enumDirection[],
* filter?: enumItemAcceptorItemFilter
* filter?: enumItemType
* }} ItemAcceptorSlot */
/**
@@ -39,7 +28,7 @@ export class ItemAcceptorComponent extends Component {
types.structured({
pos: types.vector,
directions: types.array(types.enum(enumDirection)),
filter: types.nullable(types.enum(enumItemAcceptorItemFilter)),
filter: types.nullable(types.enum(enumItemType)),
})
),
animated: types.bool,
@@ -49,16 +38,6 @@ export class ItemAcceptorComponent extends Component {
direction: types.enum(enumDirection),
})
),
// We don't actually need to store the animations
// itemConsumptionAnimations: types.array(
// types.structured({
// item: types.obj(gItemRegistry),
// slotIndex: types.uint,
// animProgress: types.float,
// direction: types.enum(enumDirection),
// })
// ),
};
}
@@ -92,7 +71,7 @@ export class ItemAcceptorComponent extends Component {
/**
*
* @param {object} param0
* @param {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemAcceptorItemFilter}>} param0.slots The slots from which we accept items
* @param {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemType}>} param0.slots The slots from which we accept items
* @param {boolean=} param0.animated Whether to animate item consumption
* @param {Array<{pos: Vector, direction: enumDirection}>=} param0.beltUnderlays Where to render belt underlays
*/
@@ -115,10 +94,10 @@ export class ItemAcceptorComponent extends Component {
/**
*
* @param {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemAcceptorItemFilter}>} slots
* @param {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemType}>} slots
*/
setSlots(slots) {
/** @type {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemAcceptorItemFilter}>} */
/** @type {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemType}>} */
this.slots = [];
for (let i = 0; i < slots.length; ++i) {
const slot = slots[i];
@@ -126,7 +105,7 @@ export class ItemAcceptorComponent extends Component {
pos: slot.pos,
directions: slot.directions,
// Which type of item to accept (shape | color | all) @see enumItemAcceptorItemFilter
// Which type of item to accept (shape | color | all) @see enumItemType
filter: slot.filter,
});
}
@@ -139,16 +118,7 @@ export class ItemAcceptorComponent extends Component {
*/
canAcceptItem(slotIndex, item) {
const slot = this.slots[slotIndex];
switch (slot.filter) {
case enumItemAcceptorItemFilter.shape: {
return item instanceof ShapeItem;
}
case enumItemAcceptorItemFilter.color: {
return item instanceof ColorItem;
}
default:
return true;
}
return slot.filter === null || slot.filter === item.getItemType();
}
/**

View File

@@ -1,7 +1,7 @@
import { Component } from "../component";
import { types } from "../../savegame/serialization";
import { gItemRegistry } from "../../core/global_registries";
import { BaseItem } from "../base_item";
import { BaseItem, enumItemType } from "../base_item";
import { ColorItem } from "../items/color_item";
import { ShapeItem } from "../items/shape_item";
@@ -60,17 +60,23 @@ export class StorageComponent extends Component {
return true;
}
if (item instanceof ColorItem) {
return this.storedItem instanceof ColorItem && this.storedItem.color === item.color;
const itemType = item.getItemType();
// Check type matches
if (itemType !== this.storedItem.getItemType()) {
return false;
}
if (item instanceof ShapeItem) {
if (itemType === enumItemType.color) {
return /** @type {ColorItem} */ (this.storedItem).color === /** @type {ColorItem} */ (item).color;
}
if (itemType === enumItemType.shape) {
return (
this.storedItem instanceof ShapeItem &&
this.storedItem.definition.getHash() === item.definition.getHash()
/** @type {ShapeItem} */ (this.storedItem).definition.getHash() ===
/** @type {ShapeItem} */ (item).definition.getHash()
);
}
return false;
}