gpt4 book ai didi

ios - 为什么 iOS 设备上的 glGenerateMipmap() 会占用如此多的客户端内存?

转载 作者:可可西里 更新时间:2023-11-01 04:43:17 27 4
gpt4 key购买 nike

我正在开发一个使用 OpenGL ES 渲染图像的 iOS 应用程序。这是我设置纹理参数和数据的函数的关键代码片段:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);

这在 iPhone 上工作得很好,但是在缩小时会出现锯齿。所以我尝试使用 mipmap,通过修改以前的代码如下:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);// for mipmapping
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
glGenerateMipmap(GL_TEXTURE_2D);// This will generate all mip-mapping textures

而且这种 mipmapping 效果很好,在缩小过程中不再出现锯齿。

但是,我发现 mipmapping 占用了太多内存:不是图形内存,而是主内存(在 OpenGL 术语中,不是服务器端内存而是客户端内存)!

我用 Instruments 的 Memory Monitor 确认:

在没有 mipmap 的情况下,我的纹理设置功能几乎不会占用任何内存,即使纹理源是 4K 分辨率图像也是如此。这样的结果清楚地证明了glTexImage2D只是在OpenGL服务器中分配内存,即显卡,因此无法被不关心显存使用情况的Memory Monitor监控。

但是在使用 glGenerateMipmap() 进行 mipmap 时,当我创建 4K 纹理时,堆内存使用量迅速增加了大约 100M。在 glDeleteTextures() 之后,它回落。

看来 glGenerateMipmap() 不仅在显存中生成 mip 贴图纹理,而且还消耗主存。而这 block 主存是可以在纹理删除后回收的。很奇怪,不是吗?

我想知道为什么。我的重点是,如何在不占用太多内存的情况下使用 mip 映射?感谢您的帮助。

最佳答案

万事如意。

  1. 您可能需要设置 GL_TEXTURE_MAX_LEVEL(默认为 1000)和 GL_TEXTURE_BASE_LEVEL(默认为 0)的值。
  2. 4K 分辨率图像并不意味着“4K 纹理”。根据我的经验,如果图像的长度为 1025 X 1025,则纹理为 2048 X 2048。请检查图像的大小。
  3. "cpu 内存"--> "主内存"; "gpu memory"--> "graphics memory",后者可能更合适。

关于ios - 为什么 iOS 设备上的 glGenerateMipmap() 会占用如此多的客户端内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41259983/

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