扩展和性能

时间:2014-08-13 13:42:03

标签: opengl graphics libgdx opengl-es-2.0

我从来没有能够理解这种情况下的最佳实践。我通常希望以尽可能小的尺寸发送我的游戏。所以尽可能地,我尝试使用图形缩放。让我们假设我必须在游戏中画出1000 X 300 px的黄色墙。所以我通常只使用3 X 3像素的黄色图像并在游戏中拉伸它(使用最近邻滤镜)。这是正确的方法吗?

让我们考虑另一种情况。让我们假设我希望在我的游戏中降雨。基本上是2 X 30 px蓝白色渐变条纹。让我们假设在任何时候都要渲染200滴最大值。现在,如果我只是在游戏中发布2 X 6 px条纹并在运行时进行缩放,它是否会影响性能。

简而言之,缩放如何影响OpenGL的性能?

2 个答案:

答案 0 :(得分:3)

您似乎在询问缩放纹理是否会影响渲染性能?

对于顶点着色器中的墙壁示例,没有区别。在片段着色器中,您将对纹理进行采样,GPU将简单地将纹理坐标乘以纹理的大小,然后对结果坐标进行舍入,并从纹理缓冲区中获取相应的像素。纹理的大小与操作是否相同并不重要。

雨的问题除了线性缩放之外还会抓取更多的像素并根据纹理坐标与它们的接近程度来组合它们。

除了这些问题,你应该想到在GPU中存储纹理的内存要求9像素需要比300,000像素少得多的内存。

答案 1 :(得分:1)

让我给你一些建议。如果您的目标是最小化app重量,我建议您生成一个像素大小的白色纹理,并尽可能使用不同颜色的每种情况(例如单色绿色墙)。

public static Texture createPixelTexture() {
        Pixmap pixmap = new Pixmap(1, 1, Pixmap.Format.RGBA8888);
        pixmap.drawPixel(0, 0, Color.WHITE.toIntBits());
        Texture texture = new Texture(pixmap);
        pixmap.dispose();
        return texture;
    }

请注意此方法为您提供unmanaged texture。这意味着每次你的应用程序失去上下文时你都必须重新创建它,当然你必须为它调用dipsose。

这适用于你只需要绘制单色的东西,如果你需要渐变方法你会遇到另一个问题......在这种情况下,你可以使用与自定义片段着色器相同的单像素白色纹理。但是这种方式是一种严肃的人,他们喜欢陷入困境,然后解决它们(有时非常缓慢),因为管理不同的着色器(我确定你至少需要2个)会使你的绘图周期变得复杂,你必须以某种方式管理它们......

所以,我只想给你一点意见。祝你好运!