Просмотр исходного кода

WebGPURenderer: Fix V8 deoptimizations.

Mr.doob 4 месяцев назад
Родитель
Сommit
bb6a315070

+ 2 - 2
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';

+ 1 - 1
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;
 
 		//
 

+ 23 - 9
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;
 
 }

+ 2 - 2
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;
 
 		}
 

+ 6 - 6
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;
 
 		}
 

粤ICP备19079148号