この質問は特定のプラットフォームに関するものではなく、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 がメモリにロードされることがわかります。
私たちの理解では、これは への呼び出しがglTexImage2D
RAW ファイルをテクスチャ ターゲット データからメモリにロードするためです。したがって、およそ 4 バイト/ピクセル (RGBA) x 1920 x 1080 = 8.1 MB になります。
これがビデオ ゲーム業界がこの問題を処理する方法であるとはとても信じられません。イメージをメモリにロードするもっと良い方法があるに違いありません。
したがって、私の質問は、OpenGL (ES) で画像をロードして、できるだけ少ないメモリを使用するための最良の方法は何ですか?