【发布时间】: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
2k 的精灵在桌面上将 fps 降至 20 以下是否正常? - (Core i5-3210M 处理器(2.50GHz 1600MHz 3MB), NVIDIA® GeForce® GT630M)
改变窗口大小影响性能正常吗?
【问题讨论】:
-
这两个问题的答案只是“取决于你实际画的是什么(以及你如何画,在一定程度上)”。
-
因此我在我能想到的最简单的代码上对其进行了测试。我没有看到任何更快的绘制方法或任何优化空间。如果这确实意味着场景不能以 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 的纹理。