浏览代码

Removed the redundant camera.update() calls.
Switched many of the lists to SafeArrayList to avoid
per frame iterator allocations.

pspeed42 11 年之前
父节点
当前提交
852ae28605
共有 1 个文件被更改,包括 18 次插入14 次删除
  1. 18 14
      jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java

+ 18 - 14
jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java

@@ -40,6 +40,7 @@ import com.jme3.texture.FrameBuffer;
 import com.jme3.texture.Image.Format;
 import com.jme3.texture.Texture2D;
 import com.jme3.ui.Picture;
+import com.jme3.util.SafeArrayList;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -62,7 +63,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
     private FrameBuffer renderFrameBuffer;
     private Texture2D filterTexture;
     private Texture2D depthTexture;
-    private List<Filter> filters = new ArrayList<Filter>();
+    private SafeArrayList<Filter> filters = new SafeArrayList<Filter>(Filter.class);
     private AssetManager assetManager;        
     private Picture fsQuad;
     private boolean computeDepth = false;
@@ -185,7 +186,10 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
         if (buff == outputBuffer) {
             viewPort.getCamera().resize(originalWidth, originalHeight, false);
             viewPort.getCamera().setViewPort(left, right, bottom, top);
-            viewPort.getCamera().update();
+            // update is redundant because resize and setViewPort will both
+            // run the appropriate (and same) onXXXChange methods.
+            // Also, update() updates some things that don't need to be updated.
+            //viewPort.getCamera().update();
             renderManager.setCamera( viewPort.getCamera(), false);        
             if (mat.getAdditionalRenderState().isDepthWrite()) {
                 mat.getAdditionalRenderState().setDepthTest(false);
@@ -194,7 +198,10 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
         }else{
             viewPort.getCamera().resize(buff.getWidth(), buff.getHeight(), false);
             viewPort.getCamera().setViewPort(0, 1, 0, 1);
-            viewPort.getCamera().update();
+            // update is redundant because resize and setViewPort will both
+            // run the appropriate (and same) onXXXChange methods.
+            // Also, update() updates some things that don't need to be updated.
+            //viewPort.getCamera().update();
             renderManager.setCamera( viewPort.getCamera(), false);            
             mat.getAdditionalRenderState().setDepthTest(true);
             mat.getAdditionalRenderState().setDepthWrite(true);
@@ -216,8 +223,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
 
     public void postQueue(RenderQueue rq) {
 
-        for (Iterator<Filter> it = filters.iterator(); it.hasNext();) {
-            Filter filter = it.next();
+        for (Filter filter : filters.getArray()) {
             if (filter.isEnabled()) {
                 filter.postQueue(rq);
             }
@@ -330,8 +336,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
            }
         }
 
-        for (Iterator<Filter> it = filters.iterator(); it.hasNext();) {
-            Filter filter = it.next();
+        for (Filter filter : filters.getArray()) {
             if (filter.isEnabled()) {
                 filter.preFrame(tpf);
             }
@@ -392,7 +397,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
             if(renderFrameBufferMS != null){
                renderFrameBufferMS.dispose();
             }
-            for (Filter filter : filters) {
+            for (Filter filter : filters.getArray()) {
                 filter.cleanup(renderer);
             }
         }
@@ -457,8 +462,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
             renderFrameBuffer.setColorTexture(filterTexture);
         }
 
-        for (Iterator<Filter> it = filters.iterator(); it.hasNext();) {
-            Filter filter = it.next();
+        for (Filter filter : filters.getArray()) {
             initFilter(filter, vp);
         }
         setupViewPortFrameBuffer();
@@ -504,14 +508,14 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
     public void write(JmeExporter ex) throws IOException {
         OutputCapsule oc = ex.getCapsule(this);
         oc.write(numSamples, "numSamples", 0);
-        oc.writeSavableArrayList((ArrayList) filters, "filters", null);
+        oc.writeSavableArrayList(new ArrayList(filters), "filters", null);
     }
 
     public void read(JmeImporter im) throws IOException {
         InputCapsule ic = im.getCapsule(this);
         numSamples = ic.readInt("numSamples", 0);
-        filters = ic.readSavableArrayList("filters", null);
-        for (Filter filter : filters) {
+        filters = new SafeArrayList<Filter>(Filter.class, ic.readSavableArrayList("filters", null));
+        for (Filter filter : filters.getArray()) {
             filter.setProcessor(this);
             setFilterState(filter, filter.isEnabled());
         }
@@ -543,7 +547,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
      * @return a filter assignable form the given type 
      */
     public <T extends Filter> T getFilter(Class<T> filterType) {
-        for (Filter c : filters) {
+        for (Filter c : filters.getArray()) {
             if (filterType.isAssignableFrom(c.getClass())) {
                 return (T) c;
             }