使用opengl将资源(图像)加载到内存的最佳方法是什么?

时间:2013-08-19 16:53:30

标签: c performance memory opengl-es

此问题与特定平台无关,与OpenGL ES有关。

我和我的兄弟正在创建一个简单的2D冒险游戏,但我们都是纯粹的OpenGL编程的新手,可能会遗漏一些明显的东西。

我们正在加载一个简单的PNG纹理,它将成为游戏背景。该纹理是一个全高清(1920x1080)png文件,磁盘大小为2.7MB。一旦加载到内存中,相同的文件现在可以在内存中保存近9MB。

以下是负责加载文件的代码示例。

int
texture_gl_create(texture_t* texture)
{
    int err;

    if (texture->id) {
        err = texture_gl_delete(texture);
        if (err) {
            return err;
        }
    }

    GL_CHECK(glGenTextures, 1, &texture->id);
    LOGD("Texture has id: %d", texture->id);

    GL_CHECK(glBindTexture, texture->target, texture->id);

    switch (texture->byte) {
        case 1:
            glPixelStorei(GL_PACK_ALIGNMENT, 1);
            break;
        case 2:
            glPixelStorei(GL_PACK_ALIGNMENT, 2);
            break;
        case 3:
        case 4:
            glPixelStorei(GL_PACK_ALIGNMENT, 4);
            break;
    }

    GL_CHECK(glTexParameteri, texture->target,
             GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    GL_CHECK(glTexParameteri, texture->target,
             GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    GL_CHECK(glTexParameteri, texture->target,
             GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    GL_CHECK(glTexParameteri, texture->target,
             GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    GL_CHECK(glTexImage2D, texture->target, 0,
             texture->iformat,
             texture->width, texture->height, 0,
             texture->format, texture->type,
             texture->pixels);

    GL_CHECK(glBindTexture, texture->target, 0);

    return 0;
}
内存分配中的

A simple look表明对glTextImage2D的调用会将8MB加载到内存中!

根据我们的理解,这是因为对glTexImage2D的调用将纹理目标数据中的RAW文件加载到内存中。因此,每像素大约有4个字节(RGBA)x 1920 x 1080 = 8.1 MB。

我简直不敢相信这是视频游戏行业处理问题的方法,必须有更好的方法将图像加载到内存中。

因此,我的问题是,在OpenGL(ES)中加载图像的最佳方法是什么,以便尽可能少地使用内存?

1 个答案:

答案 0 :(得分:2)

使用texture compression。这些特殊的压缩算法(如PVRTC)允许在图像流水线中快速实时解压缩,从而减少视频内存消耗和纹理上传时间。

使用glCompressedTexImage2D时,您需要指定使用的压缩类型(内部格式),并且您需要确定GPU by checking the extensions支持哪种压缩。