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

ChainMap: Improve dynamic key size (#32510)

sunag 1 месяц назад
Родитель
Сommit
1a8816dcd9
2 измененных файлов с 33 добавлено и 14 удалено
  1. 30 6
      src/renderers/common/ChainMap.js
  2. 3 8
      src/renderers/common/RenderContexts.js

+ 30 - 6
src/renderers/common/ChainMap.js

@@ -14,11 +14,35 @@ class ChainMap {
 	constructor() {
 
 		/**
-		 * The root Weak Map.
+		 * A map of Weak Maps by their key length.
 		 *
-		 * @type {WeakMap<Object, WeakMap>}
+		 * @type {Object<number, WeakMap>}
 		 */
-		this.weakMap = new WeakMap();
+		this.weakMaps = {};
+
+
+	}
+
+	/**
+	 * Returns the Weak Map for the given keys.
+	 *
+	 * @param {Array<Object>} keys - List of keys.
+	 * @return {WeakMap} The weak map.
+	 */
+	_getWeakMap( keys ) {
+
+		const length = keys.length;
+
+		let weakMap = this.weakMaps[ length ];
+
+		if ( weakMap === undefined ) {
+
+			weakMap = new WeakMap();
+			this.weakMaps[ length ] = weakMap;
+
+		}
+
+		return weakMap;
 
 	}
 
@@ -30,7 +54,7 @@ class ChainMap {
 	 */
 	get( keys ) {
 
-		let map = this.weakMap;
+		let map = this._getWeakMap( keys );
 
 		for ( let i = 0; i < keys.length - 1; i ++ ) {
 
@@ -53,7 +77,7 @@ class ChainMap {
 	 */
 	set( keys, value ) {
 
-		let map = this.weakMap;
+		let map = this._getWeakMap( keys );
 
 		for ( let i = 0; i < keys.length - 1; i ++ ) {
 
@@ -79,7 +103,7 @@ class ChainMap {
 	 */
 	delete( keys ) {
 
-		let map = this.weakMap;
+		let map = this._getWeakMap( keys );
 
 		for ( let i = 0; i < keys.length - 1; i ++ ) {
 

+ 3 - 8
src/renderers/common/RenderContexts.js

@@ -40,20 +40,15 @@ class RenderContexts {
 	 */
 	get( scene, camera, renderTarget = null, mrt = null ) {
 
-		let index = 0;
+		_chainKeys[ 0 ] = scene;
+		_chainKeys[ 1 ] = camera;
 
 		if ( mrt !== null ) {
 
-			// TODO: Improve ChainMap so that it only matches submaps corresponding to the key lengths.
-			// For we use: if ( mrt !== null ) _chainKeys[ 2 ] = mrt;
-
-			_chainKeys[ index ++ ] = mrt;
+			_chainKeys[ 2 ] = mrt;
 
 		}
 
-		_chainKeys[ index ++ ] = scene;
-		_chainKeys[ index ++ ] = camera;
-
 		let attachmentState;
 
 		if ( renderTarget === null ) {

粤ICP备19079148号