diff --git a/packages/core/src/batch/BatchRenderer.js b/packages/core/src/batch/BatchRenderer.js index bdacbb3..b7a9bec 100644 --- a/packages/core/src/batch/BatchRenderer.js +++ b/packages/core/src/batch/BatchRenderer.js @@ -4,7 +4,7 @@ import checkMaxIfStatementsInShader from '../shader/utils/checkMaxIfStatementsInShader'; import { settings } from '@pixi/settings'; -import { premultiplyBlendMode, premultiplyTint } from '@pixi/utils'; +import { premultiplyBlendMode, premultiplyTint, nextPow2, log2 } from '@pixi/utils'; import BatchBuffer from './BatchBuffer'; import generateMultiTextureShader from './generateMultiTextureShader'; @@ -169,13 +169,21 @@ getIndexBuffer(size) { - const roundedSize = Math.ceil(size / 100.0) * 100; + // 12 indices is enough for 2 quads + const roundedP2 = nextPow2(Math.ceil(size / 12)); + const roundedSizeIndex = log2(roundedP2); + const roundedSize = roundedP2 * 12; - let buffer = this.iBuffers[roundedSize]; + if (this.iBuffers.length <= roundedSizeIndex) + { + this.iBuffers.length = roundedSizeIndex + 1; + } + + let buffer = this.iBuffers[roundedSizeIndex]; if (!buffer) { - this.iBuffers[roundedSize] = buffer = new Uint16Array(roundedSize); + this.iBuffers[roundedSizeIndex] = buffer = new Uint16Array(roundedSize); } return buffer; @@ -183,7 +191,15 @@ getAttributeBuffer(size) { - const roundedSize = Math.ceil(size / 100.0) * 100; + // 8 vertices is enough for 2 quads + const roundedP2 = nextPow2(Math.ceil(size / 8)); + const roundedSizeIndex = log2(roundedP2); + const roundedSize = roundedP2 * 8; + + if (this.aBuffers.length <= roundedSizeIndex) + { + this.iBuffers.length = roundedSizeIndex + 1; + } let buffer = this.aBuffers[roundedSize]; diff --git a/packages/core/src/batch/BatchRenderer.js b/packages/core/src/batch/BatchRenderer.js index bdacbb3..b7a9bec 100644 --- a/packages/core/src/batch/BatchRenderer.js +++ b/packages/core/src/batch/BatchRenderer.js @@ -4,7 +4,7 @@ import checkMaxIfStatementsInShader from '../shader/utils/checkMaxIfStatementsInShader'; import { settings } from '@pixi/settings'; -import { premultiplyBlendMode, premultiplyTint } from '@pixi/utils'; +import { premultiplyBlendMode, premultiplyTint, nextPow2, log2 } from '@pixi/utils'; import BatchBuffer from './BatchBuffer'; import generateMultiTextureShader from './generateMultiTextureShader'; @@ -169,13 +169,21 @@ getIndexBuffer(size) { - const roundedSize = Math.ceil(size / 100.0) * 100; + // 12 indices is enough for 2 quads + const roundedP2 = nextPow2(Math.ceil(size / 12)); + const roundedSizeIndex = log2(roundedP2); + const roundedSize = roundedP2 * 12; - let buffer = this.iBuffers[roundedSize]; + if (this.iBuffers.length <= roundedSizeIndex) + { + this.iBuffers.length = roundedSizeIndex + 1; + } + + let buffer = this.iBuffers[roundedSizeIndex]; if (!buffer) { - this.iBuffers[roundedSize] = buffer = new Uint16Array(roundedSize); + this.iBuffers[roundedSizeIndex] = buffer = new Uint16Array(roundedSize); } return buffer; @@ -183,7 +191,15 @@ getAttributeBuffer(size) { - const roundedSize = Math.ceil(size / 100.0) * 100; + // 8 vertices is enough for 2 quads + const roundedP2 = nextPow2(Math.ceil(size / 8)); + const roundedSizeIndex = log2(roundedP2); + const roundedSize = roundedP2 * 8; + + if (this.aBuffers.length <= roundedSizeIndex) + { + this.iBuffers.length = roundedSizeIndex + 1; + } let buffer = this.aBuffers[roundedSize]; diff --git a/packages/utils/src/data/pow2.js b/packages/utils/src/data/pow2.js index f30c10a..91af8e8 100644 --- a/packages/utils/src/data/pow2.js +++ b/packages/utils/src/data/pow2.js @@ -5,7 +5,7 @@ * * @function isPow2 * @memberof PIXI.utils - * @param {number} value + * @param {number} v input value * @return {number} */ export function nextPow2(v) @@ -26,10 +26,35 @@ * * @function isPow2 * @memberof PIXI.utils - * @param {number} value - * @param {boolean} `true` if value is power of two + * @param {number} v input value + * @return {boolean} `true` if value is power of two */ export function isPow2(v) { return !(v & (v - 1)) && (!!v); } + +/** + * Computes ceil of log base 2 + * + * @function log2 + * @memberof PIXI.utils + * @param {number} v input value + * @return {number} logarithm base 2 + */ +export function log2(v) +{ + let r = (v > 0xFFFF) << 4; + + v >>>= r; + + let shift = (v > 0xFF) << 3; + + v >>>= shift; r |= shift; + shift = (v > 0xF) << 2; + v >>>= shift; r |= shift; + shift = (v > 0x3) << 1; + v >>>= shift; r |= shift; + + return r | (v >> 1); +}