3

この質問は特定のプラットフォームに関するものではなく、OpenGL ES に関連しています。

兄と私は単純な 2D アドベンチャー ゲームを作成していますが、どちらも純粋な OpenGL プログラミングは初めてで、おそらく明らかな何かが欠けています。

ゲームの背景となるシンプルな PNG テクスチャをロードしています。そのテクスチャはフル HD (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;
}

メモリ割り当てを簡単に見ると、glTextImage2D の呼び出しで 8MB がメモリにロードされることがわかります。

私たちの理解では、これは への呼び出しがglTexImage2DRAW ファイルをテクスチャ ターゲット データからメモリにロードするためです。したがって、およそ 4 バイト/ピクセル (RGBA) x 1920 x 1080 = 8.1 MB になります。

これがビデオ ゲーム業界がこの問題を処理する方法であるとはとても信じられません。イメージをメモリにロードするもっと良い方法があるに違いありません。

したがって、私の質問は、OpenGL (ES) で画像をロードして、できるだけ少ないメモリを使用するための最良の方法は何ですか?

4

1 に答える 1

2

テクスチャ圧縮を使用します。PVRTCなどのこれらの特別な圧縮アルゴリズムにより、画像パイプラインでオンザフライの高速解凍が可能になり、ビデオ メモリの消費とテクスチャのアップロード時間が短縮されます。

glCompressedTexImage2Dを使用する場合は、使用する圧縮のタイプ (内部形式) を指定する必要があります。また、拡張機能を確認して、GPU でサポートされている圧縮を特定する必要があります。

于 2013-08-20T02:39:31.570 に答える