From a423d215c88d92474c5013645606c06d4bca1d2a Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 10:55:43 +0100 Subject: [PATCH 1/7] WebGLRenderer: Fix V8 deoptimizations in materialProperties. --- src/renderers/WebGLRenderer.js | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index d5c31af24ffea6..b5592b9aff743b 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2040,12 +2040,55 @@ class WebGLRenderer { } + function initMaterialProperties( materialProperties ) { + + materialProperties.outputColorSpace = undefined; + materialProperties.batching = undefined; + materialProperties.batchingColor = undefined; + materialProperties.instancing = undefined; + materialProperties.instancingColor = undefined; + materialProperties.instancingMorph = undefined; + materialProperties.skinning = undefined; + materialProperties.morphTargets = undefined; + materialProperties.morphNormals = undefined; + materialProperties.morphColors = undefined; + materialProperties.morphTargetsCount = undefined; + materialProperties.numClippingPlanes = undefined; + materialProperties.numIntersection = undefined; + materialProperties.vertexAlphas = undefined; + materialProperties.vertexTangents = undefined; + materialProperties.toneMapping = undefined; + + materialProperties.fog = undefined; + materialProperties.environment = undefined; + materialProperties.envMap = undefined; + materialProperties.envMapRotation = undefined; + + materialProperties.programs = undefined; + materialProperties.currentProgram = undefined; + materialProperties.uniforms = undefined; + materialProperties.uniformsList = undefined; + + materialProperties.needsLights = undefined; + materialProperties.lightsStateVersion = undefined; + + materialProperties.receiveShadow = undefined; + materialProperties.__version = undefined; + + } + function getProgram( material, scene, object ) { if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... const materialProperties = properties.get( material ); + if ( materialProperties.programs === undefined ) { + + initMaterialProperties( materialProperties ); + + } + const lights = currentRenderState.state.lights; const shadowsArray = currentRenderState.state.shadowsArray; From 99400f7b96629c537d9a967737ea0a1688875b8f Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 11:43:05 +0100 Subject: [PATCH 2/7] Fixed more megamorphic property access sites. --- src/renderers/WebGLRenderer.js | 77 ++++++++++++++-------------- src/renderers/webgl/WebGLTextures.js | 32 ++++++++++-- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index b5592b9aff743b..40011ab8f3eb1a 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2040,42 +2040,7 @@ class WebGLRenderer { } - function initMaterialProperties( materialProperties ) { - - materialProperties.outputColorSpace = undefined; - materialProperties.batching = undefined; - materialProperties.batchingColor = undefined; - materialProperties.instancing = undefined; - materialProperties.instancingColor = undefined; - materialProperties.instancingMorph = undefined; - materialProperties.skinning = undefined; - materialProperties.morphTargets = undefined; - materialProperties.morphNormals = undefined; - materialProperties.morphColors = undefined; - materialProperties.morphTargetsCount = undefined; - materialProperties.numClippingPlanes = undefined; - materialProperties.numIntersection = undefined; - materialProperties.vertexAlphas = undefined; - materialProperties.vertexTangents = undefined; - materialProperties.toneMapping = undefined; - - materialProperties.fog = undefined; - materialProperties.environment = undefined; - materialProperties.envMap = undefined; - materialProperties.envMapRotation = undefined; - - materialProperties.programs = undefined; - materialProperties.currentProgram = undefined; - materialProperties.uniforms = undefined; - materialProperties.uniformsList = undefined; - - materialProperties.needsLights = undefined; - materialProperties.lightsStateVersion = undefined; - - materialProperties.receiveShadow = undefined; - materialProperties.__version = undefined; - } function getProgram( material, scene, object ) { @@ -2083,9 +2048,45 @@ class WebGLRenderer { const materialProperties = properties.get( material ); - if ( materialProperties.programs === undefined ) { - - initMaterialProperties( materialProperties ); + if ( materialProperties.init === undefined ) { + + materialProperties.init = true; + + materialProperties.outputColorSpace = undefined; + + materialProperties.batching = undefined; + materialProperties.batchingColor = undefined; + materialProperties.instancing = undefined; + materialProperties.instancingColor = undefined; + materialProperties.instancingMorph = undefined; + materialProperties.skinning = undefined; + materialProperties.morphTargets = undefined; + materialProperties.morphNormals = undefined; + materialProperties.morphColors = undefined; + materialProperties.morphTargetsCount = undefined; + materialProperties.numClippingPlanes = undefined; + materialProperties.numIntersection = undefined; + materialProperties.vertexAlphas = undefined; + materialProperties.vertexTangents = undefined; + materialProperties.toneMapping = undefined; + + materialProperties.fog = undefined; + materialProperties.environment = undefined; + materialProperties.envMap = undefined; + materialProperties.envMapRotation = undefined; + + materialProperties.programs = undefined; + materialProperties.currentProgram = undefined; + materialProperties.uniforms = undefined; + materialProperties.uniformsList = undefined; + + materialProperties.needsLights = undefined; + materialProperties.lightsStateVersion = undefined; + + materialProperties.receiveShadow = undefined; + materialProperties.light = undefined; + materialProperties.clippingState = undefined; + materialProperties.__version = undefined; } diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index 8194e20243d584..0bda2e2f2fcea2 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -672,9 +672,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, let forceUpload = false; - if ( textureProperties.__webglInit === undefined ) { + if ( textureProperties.__init === undefined ) { - textureProperties.__webglInit = true; + textureProperties.__init = true; + + textureProperties.__webglTexture = undefined; + textureProperties.__cacheKey = undefined; + textureProperties.__version = undefined; + textureProperties.__currentAnisotropy = undefined; + textureProperties.__renderTarget = undefined; texture.addEventListener( 'dispose', onTextureDispose ); @@ -1671,9 +1677,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, if ( isCube ) { // For cube depth textures, initialize and bind without uploading image data - if ( textureProperties.__webglInit === undefined ) { + if ( textureProperties.__init === undefined ) { - textureProperties.__webglInit = true; + textureProperties.__init = true; renderTarget.depthTexture.addEventListener( 'dispose', onTextureDispose ); } @@ -1907,6 +1913,24 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, const texture = renderTarget.texture; const renderTargetProperties = properties.get( renderTarget ); + + if ( renderTargetProperties.__init === undefined ) { + + renderTargetProperties.__init = true; + + renderTargetProperties.__webglFramebuffer = undefined; + renderTargetProperties.__webglDepthbuffer = undefined; + renderTargetProperties.__webglMultisampledFramebuffer = undefined; + renderTargetProperties.__webglColorRenderbuffer = undefined; + renderTargetProperties.__webglDepthRenderbuffer = undefined; + renderTargetProperties.__hasExternalTextures = undefined; + renderTargetProperties.__boundDepthTexture = undefined; + renderTargetProperties.__depthDisposeCallback = undefined; + renderTargetProperties.__autoAllocateDepthBuffer = undefined; + renderTargetProperties.__useRenderToTexture = undefined; + renderTargetProperties.__useDefaultFramebuffer = undefined; + + } const textureProperties = properties.get( texture ); renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); From e433d905abc73f769d89cc69800eaef568c3e2e3 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 11:51:34 +0100 Subject: [PATCH 3/7] Clean up. --- src/renderers/webgl/WebGLTextures.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index 0bda2e2f2fcea2..b22b4b0d200beb 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -1931,6 +1931,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, renderTargetProperties.__useDefaultFramebuffer = undefined; } + const textureProperties = properties.get( texture ); renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); From 2346fbf0f7e71f7c3ec6b607644e89dba1b160b3 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 12:06:02 +0100 Subject: [PATCH 4/7] Clean up. --- src/renderers/WebGLRenderer.js | 40 ------------ src/renderers/webgl/WebGLProperties.js | 87 +++++++++++++++++++++++++- src/renderers/webgl/WebGLTextures.js | 22 ------- 3 files changed, 86 insertions(+), 63 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 40011ab8f3eb1a..780ca320f7d491 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2048,47 +2048,7 @@ class WebGLRenderer { const materialProperties = properties.get( material ); - if ( materialProperties.init === undefined ) { - - materialProperties.init = true; - - materialProperties.outputColorSpace = undefined; - - materialProperties.batching = undefined; - materialProperties.batchingColor = undefined; - materialProperties.instancing = undefined; - materialProperties.instancingColor = undefined; - materialProperties.instancingMorph = undefined; - materialProperties.skinning = undefined; - materialProperties.morphTargets = undefined; - materialProperties.morphNormals = undefined; - materialProperties.morphColors = undefined; - materialProperties.morphTargetsCount = undefined; - materialProperties.numClippingPlanes = undefined; - materialProperties.numIntersection = undefined; - materialProperties.vertexAlphas = undefined; - materialProperties.vertexTangents = undefined; - materialProperties.toneMapping = undefined; - - materialProperties.fog = undefined; - materialProperties.environment = undefined; - materialProperties.envMap = undefined; - materialProperties.envMapRotation = undefined; - - materialProperties.programs = undefined; - materialProperties.currentProgram = undefined; - materialProperties.uniforms = undefined; - materialProperties.uniformsList = undefined; - - materialProperties.needsLights = undefined; - materialProperties.lightsStateVersion = undefined; - - materialProperties.receiveShadow = undefined; - materialProperties.light = undefined; - materialProperties.clippingState = undefined; - materialProperties.__version = undefined; - } const lights = currentRenderState.state.lights; const shadowsArray = currentRenderState.state.shadowsArray; diff --git a/src/renderers/webgl/WebGLProperties.js b/src/renderers/webgl/WebGLProperties.js index 09a495447525f0..03516c92a27415 100644 --- a/src/renderers/webgl/WebGLProperties.js +++ b/src/renderers/webgl/WebGLProperties.js @@ -14,7 +14,24 @@ function WebGLProperties() { if ( map === undefined ) { - map = {}; + if ( object.isMaterial ) { + + map = createMaterialProperties(); + + } else if ( object.isTexture ) { + + map = createTextureProperties(); + + } else if ( object.isWebGLRenderTarget ) { + + map = createRenderTargetProperties(); + + } else { + + map = {}; + + } + properties.set( object, map ); } @@ -23,6 +40,74 @@ function WebGLProperties() { } + function createMaterialProperties() { + + return { + outputColorSpace: undefined, + batching: undefined, + batchingColor: undefined, + instancing: undefined, + instancingColor: undefined, + instancingMorph: undefined, + skinning: undefined, + morphTargets: undefined, + morphNormals: undefined, + morphColors: undefined, + morphTargetsCount: undefined, + numClippingPlanes: undefined, + numIntersection: undefined, + vertexAlphas: undefined, + vertexTangents: undefined, + toneMapping: undefined, + fog: undefined, + environment: undefined, + envMap: undefined, + envMapRotation: undefined, + programs: undefined, + currentProgram: undefined, + uniforms: undefined, + uniformsList: undefined, + needsLights: undefined, + lightsStateVersion: undefined, + receiveShadow: undefined, + light: undefined, + clippingState: undefined, + __version: undefined + }; + + } + + function createTextureProperties() { + + return { + __init: undefined, + __webglTexture: undefined, + __cacheKey: undefined, + __version: undefined, + __currentAnisotropy: undefined, + __renderTarget: undefined + }; + + } + + function createRenderTargetProperties() { + + return { + __webglFramebuffer: undefined, + __webglDepthbuffer: undefined, + __webglMultisampledFramebuffer: undefined, + __webglColorRenderbuffer: undefined, + __webglDepthRenderbuffer: undefined, + __hasExternalTextures: undefined, + __boundDepthTexture: undefined, + __depthDisposeCallback: undefined, + __autoAllocateDepthBuffer: undefined, + __useRenderToTexture: undefined, + __useDefaultFramebuffer: undefined + }; + + } + function remove( object ) { properties.delete( object ); diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index b22b4b0d200beb..e2fc015da74971 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -676,12 +676,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, textureProperties.__init = true; - textureProperties.__webglTexture = undefined; - textureProperties.__cacheKey = undefined; - textureProperties.__version = undefined; - textureProperties.__currentAnisotropy = undefined; - textureProperties.__renderTarget = undefined; - texture.addEventListener( 'dispose', onTextureDispose ); } @@ -1914,23 +1908,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, const renderTargetProperties = properties.get( renderTarget ); - if ( renderTargetProperties.__init === undefined ) { - - renderTargetProperties.__init = true; - renderTargetProperties.__webglFramebuffer = undefined; - renderTargetProperties.__webglDepthbuffer = undefined; - renderTargetProperties.__webglMultisampledFramebuffer = undefined; - renderTargetProperties.__webglColorRenderbuffer = undefined; - renderTargetProperties.__webglDepthRenderbuffer = undefined; - renderTargetProperties.__hasExternalTextures = undefined; - renderTargetProperties.__boundDepthTexture = undefined; - renderTargetProperties.__depthDisposeCallback = undefined; - renderTargetProperties.__autoAllocateDepthBuffer = undefined; - renderTargetProperties.__useRenderToTexture = undefined; - renderTargetProperties.__useDefaultFramebuffer = undefined; - - } const textureProperties = properties.get( texture ); From c60282463d5e50c9ae868f508ed0b075e45319d3 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 12:12:01 +0100 Subject: [PATCH 5/7] Clean up. --- src/renderers/webgl/WebGLTextures.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index e2fc015da74971..8194e20243d584 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -672,9 +672,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, let forceUpload = false; - if ( textureProperties.__init === undefined ) { + if ( textureProperties.__webglInit === undefined ) { - textureProperties.__init = true; + textureProperties.__webglInit = true; texture.addEventListener( 'dispose', onTextureDispose ); @@ -1671,9 +1671,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, if ( isCube ) { // For cube depth textures, initialize and bind without uploading image data - if ( textureProperties.__init === undefined ) { + if ( textureProperties.__webglInit === undefined ) { - textureProperties.__init = true; + textureProperties.__webglInit = true; renderTarget.depthTexture.addEventListener( 'dispose', onTextureDispose ); } @@ -1907,9 +1907,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, const texture = renderTarget.texture; const renderTargetProperties = properties.get( renderTarget ); - - - const textureProperties = properties.get( texture ); renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); From 9d45c6c03ca406ecf68a8708d91314c9747accce Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 12:13:08 +0100 Subject: [PATCH 6/7] Clean up. --- src/renderers/WebGLRenderer.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 780ca320f7d491..d5c31af24ffea6 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2040,16 +2040,12 @@ class WebGLRenderer { } - - function getProgram( material, scene, object ) { if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... const materialProperties = properties.get( material ); - - const lights = currentRenderState.state.lights; const shadowsArray = currentRenderState.state.shadowsArray; From c6fdf14bd961d85fc4ef1ebd9313191fb5f46799 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 28 Nov 2025 12:44:25 +0100 Subject: [PATCH 7/7] Optimized WebGLBindingStates, WebGLShadowMap and WebGLTextures. --- src/renderers/webgl/WebGLBindingStates.js | 72 +++++++++-------------- src/renderers/webgl/WebGLShadowMap.js | 22 ++++--- src/renderers/webgl/WebGLTextures.js | 4 +- 3 files changed, 39 insertions(+), 59 deletions(-) diff --git a/src/renderers/webgl/WebGLBindingStates.js b/src/renderers/webgl/WebGLBindingStates.js index d63aeb7f35281a..06d1a07612bd43 100644 --- a/src/renderers/webgl/WebGLBindingStates.js +++ b/src/renderers/webgl/WebGLBindingStates.js @@ -4,7 +4,7 @@ function WebGLBindingStates( gl, attributes ) { const maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); - const bindingStates = {}; + const bindingStates = new Map(); const defaultState = createBindingState( null ); let currentState = defaultState; @@ -71,30 +71,30 @@ function WebGLBindingStates( gl, attributes ) { const wireframe = ( material.wireframe === true ); - let programMap = bindingStates[ geometry.id ]; + let programMap = bindingStates.get( geometry.id ); if ( programMap === undefined ) { - programMap = {}; - bindingStates[ geometry.id ] = programMap; + programMap = new Map(); + bindingStates.set( geometry.id, programMap ); } - let stateMap = programMap[ program.id ]; + let stateMap = programMap.get( program.id ); if ( stateMap === undefined ) { - stateMap = {}; - programMap[ program.id ] = stateMap; + stateMap = new Map(); + programMap.set( program.id, stateMap ); } - let state = stateMap[ wireframe ]; + let state = stateMap.get( wireframe ); if ( state === undefined ) { state = createBindingState( createVertexArrayObject() ); - stateMap[ wireframe ] = state; + stateMap.set( wireframe, state ); } @@ -475,77 +475,59 @@ function WebGLBindingStates( gl, attributes ) { reset(); - for ( const geometryId in bindingStates ) { + for ( const programMap of bindingStates.values() ) { - const programMap = bindingStates[ geometryId ]; + for ( const stateMap of programMap.values() ) { - for ( const programId in programMap ) { + for ( const state of stateMap.values() ) { - const stateMap = programMap[ programId ]; - - for ( const wireframe in stateMap ) { - - deleteVertexArrayObject( stateMap[ wireframe ].object ); - - delete stateMap[ wireframe ]; + deleteVertexArrayObject( state.object ); } - delete programMap[ programId ]; - } - delete bindingStates[ geometryId ]; - } + bindingStates.clear(); + } function releaseStatesOfGeometry( geometry ) { - if ( bindingStates[ geometry.id ] === undefined ) return; + if ( bindingStates.get( geometry.id ) === undefined ) return; - const programMap = bindingStates[ geometry.id ]; + const programMap = bindingStates.get( geometry.id ); - for ( const programId in programMap ) { + for ( const stateMap of programMap.values() ) { - const stateMap = programMap[ programId ]; + for ( const state of stateMap.values() ) { - for ( const wireframe in stateMap ) { - - deleteVertexArrayObject( stateMap[ wireframe ].object ); - - delete stateMap[ wireframe ]; + deleteVertexArrayObject( state.object ); } - delete programMap[ programId ]; - } - delete bindingStates[ geometry.id ]; + bindingStates.delete( geometry.id ); } function releaseStatesOfProgram( program ) { - for ( const geometryId in bindingStates ) { - - const programMap = bindingStates[ geometryId ]; - - if ( programMap[ program.id ] === undefined ) continue; + for ( const programMap of bindingStates.values() ) { - const stateMap = programMap[ program.id ]; + if ( programMap.get( program.id ) === undefined ) continue; - for ( const wireframe in stateMap ) { + const stateMap = programMap.get( program.id ); - deleteVertexArrayObject( stateMap[ wireframe ].object ); + for ( const state of stateMap.values() ) { - delete stateMap[ wireframe ]; + deleteVertexArrayObject( state.object ); } - delete programMap[ program.id ]; + programMap.delete( program.id ); } diff --git a/src/renderers/webgl/WebGLShadowMap.js b/src/renderers/webgl/WebGLShadowMap.js index e38833a78f851b..56d70e25cca6d0 100644 --- a/src/renderers/webgl/WebGLShadowMap.js +++ b/src/renderers/webgl/WebGLShadowMap.js @@ -29,7 +29,7 @@ function WebGLShadowMap( renderer, objects, capabilities ) { _depthMaterialVSM = new MeshDepthMaterial( { depthPacking: IdentityDepthPacking } ), _distanceMaterial = new MeshDistanceMaterial(), - _materialCache = {}, + _materialCache = new Map(), _maxTextureSize = capabilities.maxTextureSize; @@ -392,21 +392,21 @@ function WebGLShadowMap( renderer, objects, capabilities ) { const keyA = result.uuid, keyB = material.uuid; - let materialsForVariant = _materialCache[ keyA ]; + let materialsForVariant = _materialCache.get( keyA ); if ( materialsForVariant === undefined ) { - materialsForVariant = {}; - _materialCache[ keyA ] = materialsForVariant; + materialsForVariant = new Map(); + _materialCache.set( keyA, materialsForVariant ); } - let cachedMaterial = materialsForVariant[ keyB ]; + let cachedMaterial = materialsForVariant.get( keyB ); if ( cachedMaterial === undefined ) { cachedMaterial = result.clone(); - materialsForVariant[ keyB ] = cachedMaterial; + materialsForVariant.set( keyB, cachedMaterial ); material.addEventListener( 'dispose', onMaterialDispose ); } @@ -528,17 +528,15 @@ function WebGLShadowMap( renderer, objects, capabilities ) { // make sure to remove the unique distance/depth materials used for shadow map rendering - for ( const id in _materialCache ) { - - const cache = _materialCache[ id ]; + for ( const cache of _materialCache.values() ) { const uuid = event.target.uuid; - if ( uuid in cache ) { + if ( cache.has( uuid ) ) { - const shadowMaterial = cache[ uuid ]; + const shadowMaterial = cache.get( uuid ); shadowMaterial.dispose(); - delete cache[ uuid ]; + cache.delete( uuid ); } diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index 8194e20243d584..e95447811ff6b2 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -1776,8 +1776,8 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, const disposeEvent = () => { - delete renderTargetProperties.__boundDepthTexture; - delete renderTargetProperties.__depthDisposeCallback; + renderTargetProperties.__boundDepthTexture = undefined; + renderTargetProperties.__depthDisposeCallback = undefined; depthTexture.removeEventListener( 'dispose', disposeEvent ); };