瀏覽代碼

Merge pull request #6342 from benaadams/improve_program_dealloc

Reuse program when not changed
Ricardo Cabello 10 年之前
父節點
當前提交
3186bbf354
共有 1 個文件被更改,包括 37 次插入24 次删除
  1. 37 24
      src/renderers/WebGLRenderer.js

+ 37 - 24
src/renderers/WebGLRenderer.js

@@ -2244,30 +2244,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 	function initMaterial( material, lights, fog, object ) {
 	function initMaterial( material, lights, fog, object ) {
 
 
-		material.addEventListener( 'dispose', onMaterialDispose );
-
 		var shaderID = shaderIDs[ material.type ];
 		var shaderID = shaderIDs[ material.type ];
 
 
-		if ( shaderID ) {
-
-			var shader = THREE.ShaderLib[ shaderID ];
-
-			material.__webglShader = {
-				uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
-				vertexShader: shader.vertexShader,
-				fragmentShader: shader.fragmentShader
-			}
-
-		} else {
-
-			material.__webglShader = {
-				uniforms: material.uniforms,
-				vertexShader: material.vertexShader,
-				fragmentShader: material.fragmentShader
-			}
-
-		}
-
 		// heuristics to create shader parameters according to lights in the scene
 		// heuristics to create shader parameters according to lights in the scene
 		// (not to blow over maxLights budget)
 		// (not to blow over maxLights budget)
 
 
@@ -2366,6 +2344,43 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		var code = chunks.join();
 		var code = chunks.join();
 
 
+		if ( !material.program ) {
+
+		    // new material
+		    material.addEventListener( 'dispose', onMaterialDispose );
+
+		} else if ( material.program.code !== code ) {
+
+		    // changed glsl or parameters
+		    deallocateMaterial( material );
+
+		} else {
+
+            // same glsl and parameters
+		    return;
+
+		}
+
+		if ( shaderID ) {
+
+			var shader = THREE.ShaderLib[ shaderID ];
+
+			material.__webglShader = {
+				uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
+				vertexShader: shader.vertexShader,
+				fragmentShader: shader.fragmentShader
+			}
+
+		} else {
+
+			material.__webglShader = {
+				uniforms: material.uniforms,
+				vertexShader: material.vertexShader,
+				fragmentShader: material.fragmentShader
+			}
+
+		}
+
 		var program;
 		var program;
 
 
 		// Check if code has been already compiled
 		// Check if code has been already compiled
@@ -2477,8 +2492,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		if ( material.needsUpdate ) {
 		if ( material.needsUpdate ) {
 
 
-			if ( material.program ) deallocateMaterial( material );
-
 			initMaterial( material, lights, fog, object );
 			initMaterial( material, lights, fog, object );
 			material.needsUpdate = false;
 			material.needsUpdate = false;