Skip to content

Commit a42b511

Browse files
authored
fix some performance issues in v2 (#654)
1. Back ported the isProductionEnvironment so AssertTruthy can be tree shaken 2. Back port exporting of utils 3. Optimize WebGL loop as Shaders are ALWAYS defined on CoreNode and shaderProps as well. Requires __DEV__ to be added to vite config.
2 parents 6ecd959 + ddd4b8e commit a42b511

File tree

9 files changed

+27
-33
lines changed

9 files changed

+27
-33
lines changed

exports/utils.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
*
4040
* @module Utils
4141
*/
42-
export { assertTruthy, mergeColorAlpha, deg2Rad } from '../src/utils.js';
42+
export {
43+
assertTruthy,
44+
mergeColorAlpha,
45+
deg2Rad,
46+
mergeColorProgress,
47+
} from '../src/utils.js';
4348
export { getNormalizedRgbaComponents } from '../src/core/lib/utils.js';
4449
export { EventEmitter } from '../src/common/EventEmitter.js';
50+
export { getTimingFunction } from '../src/core/utils.js';

src/core/CoreNode.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ export class CoreNode extends EventEmitter {
802802
UpdateType.RenderState,
803803
);
804804

805-
if (isProductionEnvironment() === false && props.preventCleanup === true) {
805+
if (isProductionEnvironment === false && props.preventCleanup === true) {
806806
console.warn(
807807
'CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead',
808808
);
@@ -2223,7 +2223,7 @@ export class CoreNode extends EventEmitter {
22232223
}
22242224

22252225
set preventCleanup(value: boolean) {
2226-
if (isProductionEnvironment() === false) {
2226+
if (isProductionEnvironment === false) {
22272227
console.warn(
22282228
'CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead',
22292229
);

src/core/TextureMemoryManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ export class TextureMemoryManager {
317317
// Only emit the warning once per over-threshold period
318318
if (
319319
!this.hasWarnedAboveCritical &&
320-
(this.debugLogging === true || isProductionEnvironment() === false)
320+
(this.debugLogging === true || isProductionEnvironment === false)
321321
) {
322322
console.warn(
323323
`[TextureMemoryManager] Memory usage above critical threshold after cleanup: ${this.memUsed}`,

src/core/renderers/CoreRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ export interface QuadOptions {
4444
texture: Texture | null;
4545
textureOptions: TextureOptions | null;
4646
zIndex: number;
47-
shader: CoreShader | null;
48-
shaderProps: Record<string, unknown> | null;
47+
shader: CoreShader;
48+
shaderProps: Record<string, unknown>;
4949
alpha: number;
5050
clippingRect: RectWithValid;
5151
tx: number;

src/core/renderers/webgl/WebGlCoreRenderer.ts

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
230230
* If the shader props contain any automatic properties, update it with the
231231
* current dimensions and or alpha that will be used to render the quad.
232232
*/
233-
if (params.shaderProps !== null) {
233+
if (params.shader !== this.defaultShader) {
234234
if (hasOwn(params.shaderProps, '$dimensions') == true) {
235235
const dimensions = params.shaderProps.$dimensions as Dimensions;
236236
dimensions.width = params.width;
@@ -243,20 +243,11 @@ export class WebGlCoreRenderer extends CoreRenderer {
243243
}
244244

245245
let { curBufferIdx: bufferIdx, curRenderOp } = this;
246-
const targetDims = { width: -1, height: -1 };
247-
targetDims.width = params.width;
248-
targetDims.height = params.height;
249-
250-
const targetShader =
251-
(params.shader as WebGlCoreShader) || this.defaultShader;
252-
assertTruthy(
253-
targetShader.getUniformLocation !== undefined,
254-
'Invalid WebGL shader',
255-
);
246+
const targetDims = { width: params.width, height: params.height };
256247

257248
if (this.reuseRenderOp(params) === false) {
258249
this.newRenderOp(
259-
targetShader,
250+
params.shader as WebGlCoreShader,
260251
params.shaderProps as Record<string, unknown>,
261252
params.alpha,
262253
targetDims,
@@ -542,10 +533,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
542533
const { shader, shaderProps, parentHasRenderTexture, rtt, clippingRect } =
543534
params;
544535

545-
const targetShader = shader || this.defaultShader;
546-
547536
// Switching shader program will require a new render operation
548-
if (this.curRenderOp?.shader !== targetShader) {
537+
if (this.curRenderOp?.shader !== shader) {
549538
return false;
550539
}
551540

@@ -557,18 +546,17 @@ export class WebGlCoreRenderer extends CoreRenderer {
557546
// Force new render operation if rendering to texture
558547
// @todo: This needs to be improved, render operations could also be reused
559548
// for rendering to texture
560-
if (parentHasRenderTexture !== undefined || rtt !== undefined) {
549+
if (parentHasRenderTexture === true || rtt === true) {
561550
return false;
562551
}
563552

564553
// Check if the shader can batch the shader properties
565554
if (
566555
this.curRenderOp.shader !== this.defaultShader &&
567-
(shaderProps === null ||
568-
this.curRenderOp.shader.canBatchShaderProps(
569-
this.curRenderOp.shaderProps,
570-
shaderProps,
571-
) === false)
556+
this.curRenderOp.shader.canBatchShaderProps(
557+
this.curRenderOp.shaderProps,
558+
shaderProps,
559+
) === false
572560
) {
573561
return false;
574562
}

src/main-api/Inspector.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export class Inspector {
192192
private textureMetrics = new Map<Texture, TextureMetrics>();
193193

194194
constructor(canvas: HTMLCanvasElement, settings: RendererMainSettings) {
195-
if (isProductionEnvironment()) return;
195+
if (isProductionEnvironment) return;
196196

197197
if (!settings) {
198198
throw new Error('settings is required');

src/main-api/Renderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ export class RendererMain extends EventEmitter {
515515
targetEl.appendChild(canvas);
516516

517517
// Initialize inspector (if enabled)
518-
if (inspector && !isProductionEnvironment()) {
518+
if (inspector && !isProductionEnvironment) {
519519
this.inspector = new inspector(canvas, resolvedSettings);
520520
}
521521
}

src/utils.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export function assertTruthy(
8080
condition: unknown,
8181
message?: string,
8282
): asserts condition {
83-
if (isProductionEnvironment() === true) return;
83+
if (isProductionEnvironment) return;
8484
if (!condition) {
8585
throw new Error(message || 'Assertion failed');
8686
}
@@ -235,9 +235,9 @@ export function getImageAspectRatio(width: number, height: number): number {
235235
*
236236
* @returns
237237
*/
238-
export function isProductionEnvironment(): boolean {
239-
return import.meta.env && import.meta.env.PROD;
240-
}
238+
declare const __DEV__: boolean;
239+
export const isProductionEnvironment =
240+
typeof __DEV__ !== 'undefined' ? !__DEV__ : true;
241241

242242
/**
243243
* Returns a new unique ID
-31 Bytes
Loading

0 commit comments

Comments
 (0)