OSDN Git Service

[fixed] Mesh, Texture, ShaderProgram and FrameBuffer are now managed per Application...
authorbadlogicgames <badlogicgames@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Sat, 16 Apr 2011 10:15:20 +0000 (10:15 +0000)
committerbadlogicgames <badlogicgames@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Sat, 16 Apr 2011 10:15:20 +0000 (10:15 +0000)
[changed] JoglGraphicsBase doesn't average the delta time anymore.

backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidGraphics.java
backends/gdx-backend-jogl/src/com/badlogic/gdx/backends/jogl/JoglGraphicsBase.java
gdx/src/com/badlogic/gdx/graphics/Mesh.java
gdx/src/com/badlogic/gdx/graphics/Texture.java
gdx/src/com/badlogic/gdx/graphics/glutils/FrameBuffer.java
gdx/src/com/badlogic/gdx/graphics/glutils/ShaderProgram.java
tests/gdx-tests/src/com/badlogic/gdx/tests/utils/GdxTests.java

index 3920ee6..7ba8c1a 100644 (file)
@@ -269,10 +269,15 @@ public final class AndroidGraphics implements Graphics, Renderer {
         logConfig(config);\r
         updatePpi();\r
 \r
-        Mesh.invalidateAllMeshes();\r
-        Texture.invalidateAllTextures();\r
-        ShaderProgram.invalidateAllShaderPrograms();\r
-        FrameBuffer.invalidateAllFrameBuffers();\r
+        Mesh.invalidateAllMeshes(app);\r
+        Texture.invalidateAllTextures(app);\r
+        ShaderProgram.invalidateAllShaderPrograms(app);\r
+        FrameBuffer.invalidateAllFrameBuffers(app);\r
+        \r
+        Gdx.app.log("AndroidGraphics", Mesh.getManagedStatus());\r
+        Gdx.app.log("AndroidGraphics", Texture.getManagedStatus());\r
+        Gdx.app.log("AndroidGraphics", ShaderProgram.getManagedStatus());\r
+        Gdx.app.log("AndroidGraphics", FrameBuffer.getManagedStatus());\r
 \r
         Display display = app.getWindowManager().getDefaultDisplay();\r
         this.width = display.getWidth();\r
@@ -445,10 +450,15 @@ public final class AndroidGraphics implements Graphics, Renderer {
     }   \r
 \r
     public void clearManagedCaches() {\r
-        Mesh.clearAllMeshes();\r
-        Texture.clearAllTextures();\r
-        ShaderProgram.clearAllShaderPrograms();\r
-        FrameBuffer.clearAllFrameBuffers();\r
+        Mesh.clearAllMeshes(app);\r
+        Texture.clearAllTextures(app);\r
+        ShaderProgram.clearAllShaderPrograms(app);\r
+        FrameBuffer.clearAllFrameBuffers(app);\r
+        \r
+        Gdx.app.log("AndroidGraphics", Mesh.getManagedStatus());\r
+        Gdx.app.log("AndroidGraphics", Texture.getManagedStatus());\r
+        Gdx.app.log("AndroidGraphics", ShaderProgram.getManagedStatus());\r
+        Gdx.app.log("AndroidGraphics", FrameBuffer.getManagedStatus());\r
     }\r
 \r
     public View getView() {\r
index c64264a..49e5580 100644 (file)
@@ -41,8 +41,7 @@ public abstract class JoglGraphicsBase implements Graphics, GLEventListener {
        boolean useGL2;\r
        long frameStart = System.nanoTime();\r
        long lastFrameTime = System.nanoTime();\r
-       float deltaTime = 0;\r
-       WindowedMean mean = new WindowedMean(10);\r
+       float deltaTime = 0;    \r
        int fps;\r
        int frames;\r
        boolean paused = true;\r
@@ -79,8 +78,7 @@ public abstract class JoglGraphicsBase implements Graphics, GLEventListener {
        void create () {\r
                frameStart = System.nanoTime();\r
                lastFrameTime = frameStart;\r
-               deltaTime = 0;\r
-               mean.clear();\r
+               deltaTime = 0;          \r
                animator = new JoglAnimator(canvas);\r
 // animator.setRunAsFastAsPossible(true);\r
                animator.start();\r
@@ -97,8 +95,7 @@ public abstract class JoglGraphicsBase implements Graphics, GLEventListener {
                paused = false;\r
                frameStart = System.nanoTime();\r
                lastFrameTime = frameStart;\r
-               deltaTime = 0;\r
-               mean.clear();\r
+               deltaTime = 0;          \r
                animator = new JoglAnimator(canvas);\r
                animator.setRunAsFastAsPossible(true);\r
                animator.start();\r
@@ -130,8 +127,7 @@ public abstract class JoglGraphicsBase implements Graphics, GLEventListener {
 \r
        void updateTimes () {\r
                deltaTime = (System.nanoTime() - lastFrameTime) / 1000000000.0f;\r
-               lastFrameTime = System.nanoTime();\r
-               mean.addValue(deltaTime);\r
+               lastFrameTime = System.nanoTime();              \r
 \r
                if (System.nanoTime() - frameStart > 1000000000) {\r
                        fps = frames;\r
@@ -142,7 +138,7 @@ public abstract class JoglGraphicsBase implements Graphics, GLEventListener {
        }\r
 \r
        @Override public float getDeltaTime () {\r
-               return mean.getMean() == 0 ? deltaTime : mean.getMean();\r
+               return deltaTime;\r
        }\r
 \r
        @Override public int getFramesPerSecond () {\r
index e5178be..68f72d7 100644 (file)
@@ -18,7 +18,11 @@ package com.badlogic.gdx.graphics;
 import java.nio.FloatBuffer;\r
 import java.nio.ShortBuffer;\r
 import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
 \r
+import com.badlogic.gdx.Application;\r
 import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.graphics.VertexAttributes.Usage;\r
 import com.badlogic.gdx.graphics.glutils.IndexBufferObject;\r
@@ -68,7 +72,7 @@ public class Mesh implements Disposable {
        }\r
 \r
        /** list of all meshes **/\r
-       static final ArrayList<Mesh> meshes = new ArrayList<Mesh>();\r
+       static final Map<Application, List<Mesh>> meshes = new HashMap<Application, List<Mesh>>();\r
 \r
        /** used for benchmarking **/\r
        public static boolean forceVBO = false;\r
@@ -98,7 +102,7 @@ public class Mesh implements Disposable {
                        isVertexArray = true;\r
                }\r
 \r
-               meshes.add(this);\r
+               addManagedMesh(Gdx.app, this);\r
        }\r
        \r
        /**\r
@@ -128,7 +132,7 @@ public class Mesh implements Disposable {
                        isVertexArray = true;\r
                }\r
 \r
-               meshes.add(this);\r
+               addManagedMesh(Gdx.app, this);\r
        }\r
 \r
        /**\r
@@ -157,8 +161,7 @@ public class Mesh implements Disposable {
                        indices = new IndexBufferObject(maxIndices);\r
                        isVertexArray = true;\r
                }\r
-\r
-               meshes.add(this);\r
+               addManagedMesh(Gdx.app, this);          \r
        }\r
 \r
        /**\r
@@ -449,7 +452,7 @@ public class Mesh implements Disposable {
         * Frees all resources associated with this Mesh\r
         */\r
        public void dispose () {\r
-               meshes.remove(this);\r
+               if(meshes.get(Gdx.app) != null) meshes.get(Gdx.app).remove(this);\r
                vertices.dispose();\r
                indices.dispose();\r
        }\r
@@ -534,15 +537,24 @@ public class Mesh implements Disposable {
                return indices.getBuffer();\r
        }\r
 \r
+       private static void addManagedMesh(Application app, Mesh mesh) {\r
+               List<Mesh> managedResources = meshes.get(app);\r
+               if(managedResources == null) managedResources = new ArrayList<Mesh>();\r
+               managedResources.add(mesh);\r
+               meshes.put(app, managedResources);\r
+       }\r
+       \r
        /**\r
         * Invalidates all meshes so the next time they are rendered new VBO handles are generated.\r
+        * @param app \r
         */\r
-       public static void invalidateAllMeshes () {\r
-\r
-               for (int i = 0; i < meshes.size(); i++) {\r
-                       if (meshes.get(i).vertices instanceof VertexBufferObject) {\r
-                               ((VertexBufferObject)meshes.get(i).vertices).invalidate();\r
-                               meshes.get(i).indices.invalidate();\r
+       public static void invalidateAllMeshes (Application app) {\r
+               List<Mesh> meshesList = meshes.get(app);\r
+               if(meshesList == null) return;\r
+               for (int i = 0; i < meshesList.size(); i++) {\r
+                       if (meshesList.get(i).vertices instanceof VertexBufferObject) {\r
+                               ((VertexBufferObject)meshesList.get(i).vertices).invalidate();\r
+                               meshesList.get(i).indices.invalidate();\r
                        }\r
                }\r
        }\r
@@ -550,7 +562,19 @@ public class Mesh implements Disposable {
        /**\r
         * Will clear the managed mesh cache. I wouldn't use this if i was you :)\r
         */\r
-       public static void clearAllMeshes () {\r
-               meshes.clear();\r
+       public static void clearAllMeshes (Application app) {           \r
+               meshes.remove(app);\r
+       }\r
+       \r
+       public static String getManagedStatus() {\r
+               StringBuilder builder = new StringBuilder();\r
+               int i = 0;\r
+               builder.append("Managed meshes/app: { ");\r
+               for(Application app: meshes.keySet()) {\r
+                       builder.append(meshes.get(app).size());\r
+                       builder.append(" ");\r
+               }\r
+               builder.append("}");\r
+               return builder.toString();\r
        }\r
 }\r
index 4e11c9e..94cf3d8 100644 (file)
  ******************************************************************************/\r
 package com.badlogic.gdx.graphics;\r
 \r
-import java.nio.ByteBuffer;\r
 import java.nio.IntBuffer;\r
 import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
 \r
+import com.badlogic.gdx.Application;\r
 import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.files.FileHandle;\r
 import com.badlogic.gdx.graphics.Pixmap.Blending;\r
@@ -83,7 +86,7 @@ public class Texture implements Disposable {
        }\r
        \r
        final static IntBuffer buffer = BufferUtils.newIntBuffer(1);\r
-       final static ArrayList<Texture> managedTextures = new ArrayList<Texture>();     \r
+       final static Map<Application, List<Texture>> managedTextures = new HashMap<Application, List<Texture>>();       \r
        \r
        int width;\r
        int height;     \r
@@ -137,8 +140,8 @@ public class Texture implements Disposable {
                if(mipmap)\r
                        minFilter = TextureFilter.MipMap;\r
                setFilter(minFilter, magFilter);\r
-               setWrap(uWrap, vWrap);\r
-               managedTextures.add(this);\r
+               setWrap(uWrap, vWrap);  \r
+               addManagedTexture(Gdx.app, this);\r
        }\r
        \r
        /**\r
@@ -169,7 +172,7 @@ public class Texture implements Disposable {
                        minFilter = TextureFilter.MipMap;\r
                setFilter(minFilter, magFilter);\r
                setWrap(uWrap, vWrap);\r
-               managedTextures.add(this);\r
+               addManagedTexture(Gdx.app, this);\r
        }\r
        \r
        /**\r
@@ -255,7 +258,7 @@ public class Texture implements Disposable {
                format = Format.RGBA8888; // FIXME, let TextureData return the format upon load.\r
                this.width = textureData.getWidth();\r
                this.height = textureData.getHeight();\r
-               managedTextures.add(this);\r
+               addManagedTexture(Gdx.app, this);\r
        }\r
        \r
        private void reload() {\r
@@ -407,8 +410,9 @@ public class Texture implements Disposable {
        public void dispose () {\r
                buffer.put(0, glHandle);\r
                Gdx.gl.glDeleteTextures(1, buffer);\r
-               if(isManaged)\r
-                       managedTextures.remove(this);\r
+               if(isManaged) {\r
+                       if(managedTextures.get(Gdx.app) != null) managedTextures.get(Gdx.app).remove(this);\r
+               }\r
        }\r
 \r
        /**\r
@@ -460,23 +464,44 @@ public class Texture implements Disposable {
                        return GL10.GL_LINEAR_MIPMAP_LINEAR;\r
        }\r
        \r
+       private static void addManagedTexture(Application app, Texture texture) {\r
+               List<Texture> managedTexureList = managedTextures.get(app);\r
+               if(managedTexureList == null) managedTexureList = new ArrayList<Texture>();\r
+               managedTexureList.add(texture);\r
+               managedTextures.put(app, managedTexureList);\r
+       }\r
+       \r
        /**\r
         * Clears all managed textures. This is an internal method. Do not use it!\r
         */\r
-       public static void clearAllTextures () {\r
-               managedTextures.clear();\r
+       public static void clearAllTextures (Application app) {\r
+               managedTextures.remove(app);\r
        }\r
        \r
        /**\r
         * Invalidate all managed textures. This is an internal method. Do not use it!\r
         */\r
-       public static void invalidateAllTextures () {\r
-               for (int i = 0; i < managedTextures.size(); i++) {                      \r
-                       Texture texture = managedTextures.get(i);                       \r
+       public static void invalidateAllTextures (Application app) {\r
+               List<Texture> managedTexureList = managedTextures.get(app);\r
+               if(managedTexureList == null) return;\r
+               for (int i = 0; i < managedTexureList.size(); i++) {                    \r
+                       Texture texture = managedTexureList.get(i);                     \r
                        texture.reload();                       \r
                }               \r
        }\r
        \r
+       public static String getManagedStatus() {\r
+               StringBuilder builder = new StringBuilder();\r
+               int i = 0;\r
+               builder.append("Managed textures/app: { ");\r
+               for(Application app: managedTextures.keySet()) {\r
+                       builder.append(managedTextures.get(app).size());\r
+                       builder.append(" ");\r
+               }\r
+               builder.append("}");\r
+               return builder.toString();\r
+       }\r
+       \r
        /**\r
         * @return the {@link Format} of the Texture. For {@link TextureData} based textures this will always be RGBA8888.\r
         */\r
index 585b0e4..c077c20 100644 (file)
@@ -19,9 +19,14 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;\r
 import java.nio.IntBuffer;\r
 import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
 \r
+import com.badlogic.gdx.Application;\r
 import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.graphics.GL20;\r
+import com.badlogic.gdx.graphics.Mesh;\r
 import com.badlogic.gdx.graphics.Pixmap;\r
 import com.badlogic.gdx.graphics.Texture;\r
 import com.badlogic.gdx.graphics.Texture.TextureFilter;\r
@@ -50,7 +55,7 @@ import com.badlogic.gdx.utils.GdxRuntimeException;
  */\r
 public class FrameBuffer implements Disposable {\r
        /** the frame buffers **/\r
-       private final static ArrayList<FrameBuffer> buffers = new ArrayList<FrameBuffer>();\r
+       private final static Map<Application, List<FrameBuffer>> buffers = new HashMap<Application, List<FrameBuffer>>();\r
 \r
        /** the color buffer texture **/\r
        private Texture colorTexture;\r
@@ -85,7 +90,7 @@ public class FrameBuffer implements Disposable {
                this.format = format;\r
                build();\r
 \r
-               buffers.add(this);\r
+               addManagedFrameBuffer(Gdx.app, this);\r
        }\r
 \r
        private void build () {\r
@@ -156,7 +161,7 @@ public class FrameBuffer implements Disposable {
                handle.flip();\r
                gl.glDeleteFramebuffers(1, handle);\r
 \r
-               buffers.remove(this);\r
+               if(buffers.get(Gdx.app) != null) buffers.get(Gdx.app).remove(this);\r
        }\r
 \r
        /**\r
@@ -175,20 +180,41 @@ public class FrameBuffer implements Disposable {
                Gdx.graphics.getGL20().glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);\r
        }\r
 \r
+       private void addManagedFrameBuffer (Application app, FrameBuffer frameBuffer) {\r
+               List<FrameBuffer> managedResources = buffers.get(app);\r
+               if(managedResources == null) managedResources = new ArrayList<FrameBuffer>();\r
+               managedResources.add(frameBuffer);\r
+               buffers.put(app, managedResources);\r
+       }\r
+       \r
        /**\r
         * Invalidates all frame buffers. This can be used when the OpenGL context is lost to rebuild all managed frame buffers. This\r
         * assumes that the texture attached to this buffer has already been rebuild! Use with care.\r
         */\r
-       public static void invalidateAllFrameBuffers () {\r
+       public static void invalidateAllFrameBuffers (Application app) {\r
                if (Gdx.graphics.getGL20() == null) return;\r
 \r
-               for (int i = 0; i < buffers.size(); i++) {\r
-                       buffers.get(i).build();\r
+               List<FrameBuffer> bufferList = buffers.get(app);\r
+               if(bufferList == null) return;          \r
+               for (int i = 0; i < bufferList.size(); i++) {\r
+                       bufferList.get(i).build();\r
                }\r
        }\r
 \r
-       public static void clearAllFrameBuffers () {\r
-               buffers.clear();\r
+       public static void clearAllFrameBuffers (Application app) {\r
+               buffers.remove(app);\r
+       }\r
+       \r
+       public static String getManagedStatus() {\r
+               StringBuilder builder = new StringBuilder();\r
+               int i = 0;\r
+               builder.append("Managed buffers/app: { ");\r
+               for(Application app: buffers.keySet()) {\r
+                       builder.append(buffers.get(app).size());\r
+                       builder.append(" ");\r
+               }\r
+               builder.append("}");\r
+               return builder.toString();\r
        }\r
 \r
        /**\r
index b40601a..08a470b 100644 (file)
@@ -20,7 +20,11 @@ import java.nio.ByteOrder;
 import java.nio.FloatBuffer;\r
 import java.nio.IntBuffer;\r
 import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
 \r
+import com.badlogic.gdx.Application;\r
 import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.graphics.GL20;\r
 import com.badlogic.gdx.graphics.Mesh;\r
@@ -66,7 +70,7 @@ public class ShaderProgram implements Disposable {
        public static boolean pedantic = true;\r
        \r
        /** the list of currently available shaders **/\r
-       private final static ArrayList<ShaderProgram> shaders = new ArrayList<ShaderProgram>();\r
+       private final static Map<Application, List<ShaderProgram>> shaders = new HashMap<Application, List<ShaderProgram>>();\r
 \r
        /** the log **/\r
        private String log = "";\r
@@ -125,7 +129,7 @@ public class ShaderProgram implements Disposable {
                ByteBuffer buffer = ByteBuffer.allocateDirect(4 * 16);\r
                buffer.order(ByteOrder.nativeOrder());\r
                matrix = buffer.asFloatBuffer();\r
-               shaders.add(this);\r
+               addManagedShader(Gdx.app, this);\r
        }\r
 \r
        /**\r
@@ -528,7 +532,7 @@ public class ShaderProgram implements Disposable {
                gl.glDeleteShader(vertexShaderHandle);\r
                gl.glDeleteShader(fragmentShaderHandle);\r
                gl.glDeleteProgram(program);\r
-               shaders.remove(this);\r
+               if(shaders.get(Gdx.app) != null) shaders.get(Gdx.app).remove(this);\r
        }\r
 \r
        /**\r
@@ -564,20 +568,43 @@ public class ShaderProgram implements Disposable {
                }\r
        }\r
 \r
+       private void addManagedShader (Application app, ShaderProgram shaderProgram) {\r
+               List<ShaderProgram> managedResources = shaders.get(app);\r
+               if(managedResources == null) managedResources = new ArrayList<ShaderProgram>();\r
+               managedResources.add(shaderProgram);\r
+               shaders.put(app, managedResources);\r
+       }\r
+       \r
        /**\r
         * Invalidates all shaders so the next time they are used new handles are generated\r
+        * @param app \r
         */\r
-       public static void invalidateAllShaderPrograms () {\r
+       public static void invalidateAllShaderPrograms (Application app) {\r
                if (Gdx.graphics.getGL20() == null) return;\r
 \r
-               for (int i = 0; i < shaders.size(); i++) {\r
-                       shaders.get(i).invalidated = true;\r
-                       shaders.get(i).checkManaged();\r
+               List<ShaderProgram> shaderList = shaders.get(app);\r
+               if(shaderList == null) return;\r
+               \r
+               for (int i = 0; i < shaderList.size(); i++) {\r
+                       shaderList.get(i).invalidated = true;\r
+                       shaderList.get(i).checkManaged();\r
                }\r
        }\r
 \r
-       public static void clearAllShaderPrograms () {\r
-               shaders.clear();\r
+       public static void clearAllShaderPrograms (Application app) {\r
+               shaders.remove(app);\r
+       }\r
+       \r
+       public static String getManagedStatus() {\r
+               StringBuilder builder = new StringBuilder();\r
+               int i = 0;\r
+               builder.append("Managed shaders/app: { ");\r
+               for(Application app: shaders.keySet()) {\r
+                       builder.append(shaders.get(app).size());\r
+                       builder.append(" ");\r
+               }\r
+               builder.append("}");\r
+               return builder.toString();\r
        }\r
 \r
        /**\r
index 0c39668..e4d2251 100644 (file)
@@ -178,7 +178,7 @@ public class GdxTests
                MeshShaderTest.class,\r
                MeshTest.class,         \r
                //Mpg123Test.class,\r
-               MultitouchTest.class,\r
+               MultitouchTest.class,           \r
                MusicTest.class,\r
                MyFirstTriangle.class,\r
                ObjTest.class,\r