From bb6a315070d85dbcf0909ab2889d4404f9fd314a Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 12:28:29 +0100 Subject: [PATCH] WebGPURenderer: Fix V8 deoptimizations. --- src/nodes/core/NodeBuilder.js | 4 ++-- src/nodes/core/UniformNode.js | 2 +- src/renderers/common/RenderObject.js | 32 ++++++++++++++++++++-------- src/renderers/common/Renderer.js | 4 ++-- src/renderers/common/nodes/Nodes.js | 12 +++++------ 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index 822e74871ee1e4..4d843af47b4b7f 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -952,7 +952,7 @@ class NodeBuilder { const context = { ...this.context }; - delete context.material; + context.material = undefined; return this.context; @@ -2515,7 +2515,7 @@ class NodeBuilder { this.setShaderStage( shaderStage ); const context = { ...this.context }; - delete context.nodeBlock; + context.nodeBlock = undefined; this.cache = this.globalCache; this.tab = '\t'; diff --git a/src/nodes/core/UniformNode.js b/src/nodes/core/UniformNode.js index 8b070ab837c675..f261025e95c068 100644 --- a/src/nodes/core/UniformNode.js +++ b/src/nodes/core/UniformNode.js @@ -175,7 +175,7 @@ class UniformNode extends InputNode { const nodeUniform = builder.getUniformFromNode( sharedNode, sharedNodeType, builder.shaderStage, this.name || builder.context.nodeName ); const uniformName = builder.getPropertyName( nodeUniform ); - if ( builder.context.nodeName !== undefined ) delete builder.context.nodeName; + if ( builder.context.nodeName !== undefined ) builder.context.nodeName = undefined; // diff --git a/src/renderers/common/RenderObject.js b/src/renderers/common/RenderObject.js index 4b6009b728f32d..1b1e3d591a880f 100644 --- a/src/renderers/common/RenderObject.js +++ b/src/renderers/common/RenderObject.js @@ -2,36 +2,50 @@ import { hash, hashString } from '../../nodes/core/NodeUtils.js'; let _id = 0; +const prototypeKeys = new WeakMap(); + function getKeys( obj ) { const keys = Object.keys( obj ); - let proto = Object.getPrototypeOf( obj ); + const proto = Object.getPrototypeOf( obj ); + let cachedKeys = prototypeKeys.get( proto ); + + if ( cachedKeys === undefined ) { - while ( proto ) { + cachedKeys = []; + let p = proto; - const descriptors = Object.getOwnPropertyDescriptors( proto ); + while ( p ) { - for ( const key in descriptors ) { + const descriptors = Object.getOwnPropertyDescriptors( p ); - if ( descriptors[ key ] !== undefined ) { + for ( const key in descriptors ) { - const descriptor = descriptors[ key ]; + if ( descriptors[ key ] !== undefined ) { - if ( descriptor && typeof descriptor.get === 'function' ) { + const descriptor = descriptors[ key ]; - keys.push( key ); + if ( descriptor && typeof descriptor.get === 'function' ) { + + cachedKeys.push( key ); + + } } } + p = Object.getPrototypeOf( p ); + } - proto = Object.getPrototypeOf( proto ); + prototypeKeys.set( proto, cachedKeys ); } + keys.push( ...cachedKeys ); + return keys; } diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 87829026246269..ad9392ccedceb8 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -1037,8 +1037,8 @@ class Renderer { } else if ( this.highPrecision ) { - delete contextNodeData.modelViewMatrix; - delete contextNodeData.modelNormalViewMatrix; + contextNodeData.modelViewMatrix = undefined; + contextNodeData.modelNormalViewMatrix = undefined; } diff --git a/src/renderers/common/nodes/Nodes.js b/src/renderers/common/nodes/Nodes.js index 832544018c93a7..636c3abdb13e0a 100644 --- a/src/renderers/common/nodes/Nodes.js +++ b/src/renderers/common/nodes/Nodes.js @@ -525,8 +525,8 @@ class Nodes extends DataMap { } else if ( sceneData.backgroundNode ) { - delete sceneData.backgroundNode; - delete sceneData.background; + sceneData.backgroundNode = undefined; + sceneData.background = undefined; } @@ -606,8 +606,8 @@ class Nodes extends DataMap { } else { - delete sceneData.fogNode; - delete sceneData.fog; + sceneData.fogNode = undefined; + sceneData.fog = undefined; } @@ -653,8 +653,8 @@ class Nodes extends DataMap { } else if ( sceneData.environmentNode ) { - delete sceneData.environmentNode; - delete sceneData.environment; + sceneData.environmentNode = undefined; + sceneData.environment = undefined; }