【问题标题】:Thousand sprite draws poor performance千位精灵绘制性能不佳
【发布时间】:2019-06-04 17:32:22
【问题描述】:

我正在编写一个应用程序,我遇到了低 fps,我发现几乎所有的 CPU 时间都被 spriteBatch.draw() 方法消耗(大约一千次调用)。所以我创建了简单的绘图应用程序

public void render() {
    spriteBatch.begin();
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    for (int i = 0; i < 2000; i++) {
        spriteBatch.draw(tex, 0, 0);
    }
    spriteBatch.end();
}

应用程序运行 18fps 当我增加窗口大小以使其几乎填满整个屏幕时,fps 降至 7!,当窗口大小变小时,它以 60fps 运行,在全屏时我得到 20FPS(1600x900) - 比最大化窗口更好 我只使用一个纹理(512、512 - png),spriteBatch 上的 maxRenderCalls 是 2,polygonSpriteBatch 上是 5 - 两者都相同 FPS 禁用混合 -> 没有变化,相同的 FPS

  1. 2k 的精灵在桌面上将 fps 降至 20 以下是否正常? - (Core i5-3210M 处理器(2.50GHz 1600MHz 3MB), NVIDIA® GeForce® GT630M)

  2. 改变窗口大小影响性能正常吗?

【问题讨论】:

  • 这两个问题的答案只是“取决于你实际画的是什么(以及你如何画,在一定程度上)”。
  • 因此我在我能想到的最简单的代码上对其进行了测试。我没有看到任何更快的绘制方法或任何优化空间。如果这确实意味着场景不能以 30fps 的速度绘制 1000 多个精灵,那么如何制作游戏?游戏需要大量的精灵、粒子效果+、逻辑+物理。
  • 嗯,有很多未知数:例如,每个精灵有多大?绘制 2000 个全屏四边形肯定会降低任何 GPU 的性能。还有很多优化的潜力:首先,放弃 libgdx,并使用一些不错的现代 GL 功能。避免每个精灵使用单个纹理对象,使用数组纹理。理想情况下,这可以优化为单个绘图调用,GL wise。
  • LibGDX 在桌面上以 60fps 的速度绘制数千个精灵,如果它们像您正在做的那样引用相同的纹理,只要它们在屏幕上很小。但是您将它们绘制为 512x512(大概具有 1:1 像素比例),因此您遇到了填充率瓶颈。这也可以解释为什么放大窗口时 FPS 会下降。将spriteBatch.draw(tex, 0, 0); 更改为spriteBatch.draw(tex, 0, 0, 16, 16);,您将轻松达到60fps。
  • 对于这种情况,简单来说你应该考虑顶点着色器和片段着色器。每个 Sprite 有四个顶点,因此每个 Sprite 每帧必须运行顶点程序四次。但是一个 512x512 像素的图像(在屏幕尺寸上,而不是在纹理尺寸上)每个 Sprite 每帧必须运行片段着色器程序 260K 次!屏幕尺寸绝对很重要。如果您使用 mip 映射,则源纹理大小与性能不是很相关。如果你在屏幕上画小点,你可以很容易地画出 2000 个 512x512 的纹理。

标签: java opengl libgdx


【解决方案1】:

我会尝试自己回答(请随时发布更好的答案)

正常的。

性能问题的主要原因是尺寸。 绘制尺寸真的很重要,当我以十分之一的尺寸绘制时,即使使用 50 000 个精灵,我也能获得 30fps!

使用 PolygonSpriteBatch 时,即使启用了混合,我也可以获得更多 (48fps)!

而且过于频繁地启用和禁用出血(我已经完成了 1000 次以上一帧),确实会对性能产生负面影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2015-04-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多