Explorar el Código

Reduce "Integer" class churn in rendering statistics
* Use IntMap instead of HashMap<Integer>
* Cache last set shader to save hashmap lookup on every set uniform

shadowislord hace 11 años
padre
commit
bbd6c613f0
Se han modificado 1 ficheros con 21 adiciones y 10 borrados
  1. 21 10
      jme3-core/src/main/java/com/jme3/renderer/Statistics.java

+ 21 - 10
jme3-core/src/main/java/com/jme3/renderer/Statistics.java

@@ -35,6 +35,7 @@ import com.jme3.scene.Mesh;
 import com.jme3.shader.Shader;
 import com.jme3.texture.FrameBuffer;
 import com.jme3.texture.Image;
+import com.jme3.util.IntMap;
 import java.util.HashSet;
 
 /**
@@ -60,10 +61,12 @@ public class Statistics {
     protected int memoryFrameBuffers;
     protected int memoryTextures;
 
-    protected HashSet<Integer> shadersUsed = new HashSet<Integer>();
-    protected HashSet<Integer> texturesUsed = new HashSet<Integer>();
-    protected HashSet<Integer> fbosUsed = new HashSet<Integer>();
+    protected IntMap<Void> shadersUsed = new IntMap<Void>();
+    protected IntMap<Void> texturesUsed = new IntMap<Void>();
+    protected IntMap<Void> fbosUsed = new IntMap<Void>();
 
+    protected int lastShader = -1;
+    
     /**
      * Returns a list of labels corresponding to each statistic.
      * 
@@ -148,9 +151,15 @@ public class Statistics {
 
         if( !enabled )
             return;
-            
-        if (!shadersUsed.contains(shader.getId()))
-            shadersUsed.add(shader.getId());
+        
+        // Reduces unneccessary hashmap lookups if
+        // we already considered this shader.
+        if (lastShader != shader.getId()) {
+            lastShader = shader.getId();
+            if (!shadersUsed.containsKey(shader.getId())) {
+                shadersUsed.put(shader.getId(), null);
+            }
+        }
 
         if (wasSwitched)
             numShaderSwitches++;
@@ -177,8 +186,8 @@ public class Statistics {
         if( !enabled )
             return;
             
-        if (!texturesUsed.contains(image.getId()))
-            texturesUsed.add(image.getId());
+        if (!texturesUsed.containsKey(image.getId()))
+            texturesUsed.put(image.getId(), null);
 
         if (wasSwitched)
             numTextureBinds ++;
@@ -197,8 +206,8 @@ public class Statistics {
         if (fb != null){
             assert fb.getId() >= 1;
 
-            if (!fbosUsed.contains(fb.getId()))
-                fbosUsed.add(fb.getId());
+            if (!fbosUsed.containsKey(fb.getId()))
+                fbosUsed.put(fb.getId(), null);
         }
 
         if (wasSwitched)
@@ -220,6 +229,8 @@ public class Statistics {
         numTextureBinds = 0;
         numFboSwitches = 0;
         numUniformsSet = 0;
+        
+        lastShader = -1;
     }
 
     /**