Explorar el Código

Added memory test for deallocateMaterial.

This is pretty brutal, creating new shaders all the time is very costly.
alteredq hace 14 años
padre
commit
b1181354c4
Se han modificado 2 ficheros con 147 adiciones y 1 borrados
  1. 146 0
      examples/webgl_test_memory2.html
  2. 1 1
      src/renderers/WebGLRenderer.js

+ 146 - 0
examples/webgl_test_memory2.html

@@ -0,0 +1,146 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<title>three.js - webgl</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<style>
+			body {
+				background:#fff;
+				padding:0;
+				margin:0;
+				overflow:hidden;
+			}
+
+		</style>
+	</head>
+
+	<body>
+		<script type="x-shader/x-fragment" id="fragmentShader">
+
+			void main() {
+
+				if ( mod ( gl_FragCoord.x, 4.0001 ) < 1.0 || mod ( gl_FragCoord.y, 4.0001 ) < 1.0 )
+
+					gl_FragColor = vec4( XXX, 1.0 );
+
+				else
+
+					gl_FragColor = vec4( 1.0 );
+
+			}
+
+		</script>
+
+		<script type="x-shader/x-vertex" id="vertexShader">
+
+			void main() {
+
+				vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
+				gl_Position = projectionMatrix * mvPosition;
+
+			}
+
+		</script>
+
+		<script src="../build/Three.js"></script>
+
+		<script>
+
+			var N = 100;
+
+			var container;
+
+			var camera, scene, renderer;
+
+			var geometry, meshes = [];
+
+			var fragmentShader, vertexShader;
+
+			init();
+			setInterval( render, 1000 / 60 );
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				vertexShader = document.getElementById( "vertexShader" ).textContent;
+				fragmentShader = document.getElementById( "fragmentShader" ).textContent;
+
+				scene = new THREE.Scene();
+
+				camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
+				camera.position.z = 2000;
+				scene.add( camera );
+
+				geometry = new THREE.SphereGeometry( 15, 64, 32 );
+
+				for ( var i = 0; i < N; i ++ ) {
+
+					var material = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: generateFragmentShader() } );
+
+					mesh = new THREE.Mesh( geometry, material );
+
+					mesh.position.x = ( 0.5 - Math.random() ) * 1000;
+					mesh.position.y = ( 0.5 - Math.random() ) * 1000;
+					mesh.position.z = ( 0.5 - Math.random() ) * 1000;
+
+					scene.add( mesh );
+
+					meshes.push( mesh );
+
+				}
+
+				renderer = new THREE.WebGLRenderer();
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				container.appendChild( renderer.domElement );
+
+			}
+
+			//
+
+			function generateFragmentShader() {
+
+				return fragmentShader.replace( "XXX", Math.random() + "," + Math.random() + "," + Math.random() );
+
+			}
+
+			//
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+
+				render();
+
+			}
+
+			function render() {
+
+				for ( var i = 0; i < N; i ++ ) {
+
+					var mesh = meshes[ i ];
+					mesh.material = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: generateFragmentShader() } );
+
+				}
+
+				renderer.render( scene, camera );
+
+				console.log( "before", renderer.info.memory.programs );
+
+				for ( var i = 0; i < N; i ++ ) {
+
+					var mesh = meshes[ i ];
+					renderer.deallocateMaterial( mesh.material );
+
+				}
+
+				console.log( "after", renderer.info.memory.programs );
+
+			}
+
+		</script>
+
+	</body>
+</html>

+ 1 - 1
src/renderers/WebGLRenderer.js

@@ -3375,7 +3375,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		// load updated influences uniform
 
-		if( material.program.uniforms.morphTargetInfluences !== null ) {
+		if ( material.program.uniforms.morphTargetInfluences !== null ) {
 
 			_gl.uniform1fv( material.program.uniforms.morphTargetInfluences, object.__webglMorphTargetInfluences );
 

粤ICP备19079148号