2015-04-26 44 views
0

我使用ShapeRenderer对象在我的游戏中创建颜色渐变(Screen类)。分配的内存用于永久增长,直到我在每次调用后开始处理我的ShapeRenderer对象。我如何重用我的颜色渐变?有没有办法将渐变绘制到纹理中(仅在渲染方法中重复使用一次)?LibGDX:在渲染方法中创建和配置ShapeRenderer?

public void render(float deltaTime) { 
    camera.update(); 
    batch.setProjectionMatrix(camera.combined); 

    ShapeRenderer shapeRenderer = new ShapeRenderer(); 
    shapeRenderer.setProjectionMatrix(camera.combined); 
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); 
    shapeRenderer.rect(0, 0, screenWidth, screenHeight, topColor, topColor, bottomColor, bottomColor); 
    shapeRenderer.end(); 
    shapeRenderer.dispose(); 

    batch.begin(); 
    ... 
    batch.end(); 
} 
+1

我不会在飞行中渲染此图像,而是提供预制图像。然而,如果你想继续这样做,你可以使用['Framebuffer'](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/FrameBuffer .html)将其渲染为纹理以供重用。 – noone

+0

作为一个小改进,我使shapeRenderer成为一个类变量,因此我不需要再处理它(在'render'方法中)。使用'Framebuffer'听起来不错(尽管我仍然不知道如何做到这一点)。我宁愿随时创建渐变,因为我需要许多不同的渐变。这也应该具有这样的优点,即即使在超高dpi设备上,渐变看起来也更平滑(与缩放纹理相比)。 – MaxGyver

+0

对于制作1px宽度和不同高度的颜色渐变图像,然后将它们缩放到屏幕宽度,您有什么想法?那会过度优化吗? – MaxGyver

回答

2

虽然看起来你已经解决您的问题,在这里只为你一个小纸条,任何人都碰到这个职位绊脚石了类似的问题。

不惜任何代价,在循环的每次运行期间不要实例化新的对象(任何类型)。你遇到减速的原因正是因为这一点。每当你实例化一个新对象,然后停止使用它时,JVM的垃圾收集器需要摆脱那个对象。你应该总是尝试重用对象。这就是为什么poolsmemory management一般(这些链接是针对LibGdx的)特别重要。

您为ShapeRenderer创建一个字段的想法很不错,只是不要忘记在您的游戏的dispose()方法中使用dispose()