diff options
Diffstat (limited to 'engine/src/core/com/jme3/renderer/Statistics.java')
-rw-r--r-- | engine/src/core/com/jme3/renderer/Statistics.java | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/engine/src/core/com/jme3/renderer/Statistics.java b/engine/src/core/com/jme3/renderer/Statistics.java new file mode 100644 index 0000000..fb8f2a0 --- /dev/null +++ b/engine/src/core/com/jme3/renderer/Statistics.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2009-2010 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.renderer; + +import com.jme3.scene.Mesh; +import com.jme3.shader.Shader; +import com.jme3.texture.FrameBuffer; +import com.jme3.texture.Image; +import java.util.HashSet; + +/** + * The statistics class allows tracking of real-time rendering statistics. + * <p> + * The <code>Statistics</code> can be retrieved by using {@link Renderer#getStatistics() }. + * + * @author Kirill Vainer + */ +public class Statistics { + + protected int numObjects; + protected int numTriangles; + protected int numVertices; + protected int numShaderSwitches; + protected int numTextureBinds; + protected int numFboSwitches; + protected int numUniformsSet; + + protected int memoryShaders; + 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>(); + + /** + * Returns a list of labels corresponding to each statistic. + * + * @return a list of labels corresponding to each statistic. + * + * @see #getData(int[]) + */ + public String[] getLabels(){ + return new String[]{ "Vertices", + "Triangles", + "Uniforms", + + "Objects", + + "Shaders (S)", + "Shaders (F)", + "Shaders (M)", + + "Textures (S)", + "Textures (F)", + "Textures (M)", + + "FrameBuffers (S)", + "FrameBuffers (F)", + "FrameBuffers (M)" }; + + } + + /** + * Retrieves the statistics data into the given array. + * The array should be as large as the array given in + * {@link #getLabels() }. + * + * @param data The data array to write to + */ + public void getData(int[] data){ + data[0] = numVertices; + data[1] = numTriangles; + data[2] = numUniformsSet; + data[3] = numObjects; + + data[4] = numShaderSwitches; + data[5] = shadersUsed.size(); + data[6] = memoryShaders; + + data[7] = numTextureBinds; + data[8] = texturesUsed.size(); + data[9] = memoryTextures; + + data[10] = numFboSwitches; + data[11] = fbosUsed.size(); + data[12] = memoryFrameBuffers; + } + + /** + * Called by the Renderer when a mesh has been drawn. + * + */ + public void onMeshDrawn(Mesh mesh, int lod){ + numObjects ++; + numTriangles += mesh.getTriangleCount(lod); + numVertices += mesh.getVertexCount(); + } + + /** + * Called by the Renderer when a shader has been utilized. + * + * @param shader The shader that was used + * @param wasSwitched If true, the shader has required a state switch + */ + public void onShaderUse(Shader shader, boolean wasSwitched){ + assert shader.getId() >= 1; + + if (!shadersUsed.contains(shader.getId())) + shadersUsed.add(shader.getId()); + + if (wasSwitched) + numShaderSwitches++; + } + + /** + * Called by the Renderer when a uniform was set. + */ + public void onUniformSet(){ + numUniformsSet ++; + } + + /** + * Called by the Renderer when a texture has been set. + * + * @param image The image that was set + * @param wasSwitched If true, the texture has required a state switch + */ + public void onTextureUse(Image image, boolean wasSwitched){ + assert image.getId() >= 1; + + if (!texturesUsed.contains(image.getId())) + texturesUsed.add(image.getId()); + + if (wasSwitched) + numTextureBinds ++; + } + + /** + * Called by the Renderer when a framebuffer has been set. + * + * @param fb The framebuffer that was set + * @param wasSwitched If true, the framebuffer required a state switch + */ + public void onFrameBufferUse(FrameBuffer fb, boolean wasSwitched){ + if (fb != null){ + assert fb.getId() >= 1; + + if (!fbosUsed.contains(fb.getId())) + fbosUsed.add(fb.getId()); + } + + if (wasSwitched) + numFboSwitches ++; + } + + /** + * Clears all frame-specific statistics such as objects used per frame. + */ + public void clearFrame(){ + shadersUsed.clear(); + texturesUsed.clear(); + fbosUsed.clear(); + + numObjects = 0; + numTriangles = 0; + numVertices = 0; + numShaderSwitches = 0; + numTextureBinds = 0; + numFboSwitches = 0; + numUniformsSet = 0; + } + + /** + * Called by the Renderer when it creates a new shader + */ + public void onNewShader(){ + memoryShaders ++; + } + + /** + * Called by the Renderer when it creates a new texture + */ + public void onNewTexture(){ + memoryTextures ++; + } + + /** + * Called by the Renderer when it creates a new framebuffer + */ + public void onNewFrameBuffer(){ + memoryFrameBuffers ++; + } + + /** + * Called by the Renderer when it deletes a shader + */ + public void onDeleteShader(){ + memoryShaders --; + } + + /** + * Called by the Renderer when it deletes a texture + */ + public void onDeleteTexture(){ + memoryTextures --; + } + + /** + * Called by the Renderer when it deletes a framebuffer + */ + public void onDeleteFrameBuffer(){ + memoryFrameBuffers --; + } + + /** + * Called when video memory is cleared. + */ + public void clearMemory(){ + memoryFrameBuffers = 0; + memoryShaders = 0; + memoryTextures = 0; + } + +} |