gpt4 book ai didi

c - 使用 opengl 将 Assets (图像)加载到内存中的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-04 11:55:28 29 4
gpt4 key购买 nike

此问题与特定平台无关,与 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) 中加载图像的最佳方式是什么,以便我们使用尽可能少的内存?

最佳答案

使用texture compression .这些特殊的压缩算法,如 PVRTC允许在图像管道中快速即时解压缩,减少视频内存消耗和纹理上传时间。

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

关于c - 使用 opengl 将 Assets (图像)加载到内存中的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319062/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com