diff --git a/packages/core/src/utils/ClearableObjectPool.ts b/packages/core/src/utils/ClearableObjectPool.ts index a48ef7e222..522e02a1a1 100644 --- a/packages/core/src/utils/ClearableObjectPool.ts +++ b/packages/core/src/utils/ClearableObjectPool.ts @@ -6,9 +6,8 @@ import { IPoolElement, ObjectPool } from "./ObjectPool"; export class ClearableObjectPool extends ObjectPool { private _usedElementCount: number = 0; - constructor(type: new () => T) { - super(type); - this._elements = []; + constructor(type: new () => T, initializeCount: number = 0) { + super(type, initializeCount); } /** diff --git a/packages/core/src/utils/ObjectPool.ts b/packages/core/src/utils/ObjectPool.ts index 5b5cab525b..c6a5e2bf9f 100644 --- a/packages/core/src/utils/ObjectPool.ts +++ b/packages/core/src/utils/ObjectPool.ts @@ -2,8 +2,12 @@ export abstract class ObjectPool { protected _type: new () => T; protected _elements: T[]; - constructor(type: new () => T) { + constructor(type: new () => T, initializeCount: number = 0) { this._type = type; + const elements = (this._elements = new Array(initializeCount)); + for (let i = 0; i < initializeCount; i++) { + elements[i] = new type(); + } } garbageCollection(): void { diff --git a/packages/core/src/utils/ReturnableObjectPool.ts b/packages/core/src/utils/ReturnableObjectPool.ts index 7a1aa8ccc7..bf7f70b6d3 100644 --- a/packages/core/src/utils/ReturnableObjectPool.ts +++ b/packages/core/src/utils/ReturnableObjectPool.ts @@ -7,12 +7,8 @@ export class ReturnableObjectPool extends ObjectPool private _lastElementIndex: number; constructor(type: new () => T, initializeCount: number = 1) { - super(type); + super(type, initializeCount); this._lastElementIndex = initializeCount - 1; - const elements = (this._elements = new Array(initializeCount)); - for (let i = 0; i < initializeCount; ++i) { - elements[i] = new type(); - } } /** @@ -22,7 +18,9 @@ export class ReturnableObjectPool extends ObjectPool if (this._lastElementIndex < 0) { return new this._type(); } - return this._elements[this._lastElementIndex--]; + const ret = this._elements[this._lastElementIndex--]; + this._elements.length -= 1; + return ret; } /** diff --git a/packages/shader-lab/src/ShaderLab.ts b/packages/shader-lab/src/ShaderLab.ts index 35c42cdef2..bb4bae7931 100644 --- a/packages/shader-lab/src/ShaderLab.ts +++ b/packages/shader-lab/src/ShaderLab.ts @@ -16,11 +16,11 @@ export class ShaderLab implements IShaderLab { /** * @internal */ - private static _shaderPositionPool = new ClearableObjectPool(ShaderPosition); + private static _shaderPositionPool = new ClearableObjectPool(ShaderPosition, 1000); /** * @internal */ - private static _shaderRangePool = new ClearableObjectPool(ShaderRange); + private static _shaderRangePool = new ClearableObjectPool(ShaderRange, 500); static createPosition( index: number,