【问题标题】:LibGDX: Create and dispose ShapeRenderer in render method?LibGDX:在渲染方法中创建和处置 ShapeRenderer?
【发布时间】:2015-04-26 09:54:03
【问题描述】:

我正在使用ShapeRenderer 对象在我的游戏中创建颜色渐变(Screen 类)。分配的内存用于永久增长,直到我在每次调用后开始处理我的 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();
}

【问题讨论】:

  • 我不会即时渲染它,而是提供预制图像。但是,如果您出于某种原因想继续这样做,您可以使用 Framebuffer 将其渲染为纹理以供重复使用。
  • 作为一个小改进,我将 shapeRenderer 设为类变量,因此我不再需要处理它(在 render 方法中)。使用Framebuffer 听起来不错(尽管我仍然不知道该怎么做)。我更喜欢动态创建渐变,因为我需要许多不同的渐变。这还应该有一个优点,即使在超高 dpi 设备上(与缩放的纹理相比),渐变看起来也更平滑。
  • 您如何看待制作 1px 宽度和不同高度的颜色渐变图像,然后将它们缩放到屏幕宽度?会不会过度优化?
  • 不,这是一种完全有效的方法。尽管您甚至不需要制作不同的高度。沿着渐变拉伸它们也可以。

标签: java libgdx


【解决方案1】:

虽然您的问题似乎已经解决,但这里只是给您和任何偶然发现这篇文章并遇到类似问题的人的一点提示。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多