ios - 在 opengl es 2 中如何释放纹理(ios 硬崩溃)

标签 ios opengl-es crash textures

我有一个 iOS opengl es 2.0 应用程序需要使用大量大型纹理。理想情况下为 4096x4096。我有一个结构数组,其中包含有关纹理的所有信息,因为我需要使用每个纹理,所以我使用 glGenTextures 一个新的纹理 ID 并在其中加载图像,释放 uiimage 等。这一切都很好。

我的应用程序为 UI、图像处理等使用了一堆纹理。我使用的 15 个中大约有 4-5 个是 4k x 4k。其余的较小。然后这些按需加载的贴图也是4k的。

在大约第 4-5 次加载时,应用程序崩溃了。没有控制台或调试。只是在尝试加载下一个纹理的过程中退出跳板。

我没有内存泄漏 - 我运行了仪器。我正在使用 ARC。我可以发布来自组织者的崩溃报告,但它没有太多信息。只是我的应用程序的 rpages 是 170504。

我可以发布图像加载代码,但它与我多年来在所有应用程序中使用的代码相同。新事物正在努力插入系统并尝试加载那么多大纹理。

Q1: Anyone have experience with using a ton of large textures?

所以我下定决心,我必须以 1024x1024 分辨率进行预览,然后以 4096 分辨率进行最终分辨率处理。1k 图像现在会根据需要加载并保持加载状态。 4k 图像将一次加载一个到相同的纹理中以供使用,然后继续下一个。

我在我的图像加载器中写入了一个预览参数,当设置它时,它会在加载期间缩小图像以适应 1024。现在我可以“整天”添加纹理,而不是在 4 日或 5 日崩溃。我的猜测是我可以做的是以前的 16 倍。但我一次只需要 20-30 个。 (只有!)到目前为止,我已经尝试了 20 次,没有内存警告或崩溃。

但是.. 如果应用程序继续运行,因为我的纹理以唯一的纹理 id 加载,在某些时候我会到达那个地方,我需要卸载一个不再需要加载下一个的位置。这可能非常简单,但是......

Q2: How do I free up a texture that's at an texture id when I no longer need it?

Q3: Will a memory warning tell me that I need to free up an open gl texture?

Q4: Aren't textures loaded on the PVR chip? Are they or how are they even taking up the phone's memory?

谢谢!

最佳答案

去除纹理: 您必须从主线程使用此 GL 调用。

glDeleteTextures(1, &_texture);

内存警告是对应用程序的一般调用。它不会给你具体的信息。如果不再需要不需要的纹理,最好从内存中删除它们。例如:我们通常会在用户移动到游戏内屏幕时删除菜单中使用的纹理,并在用户返回时重新加载它们。这比等待系统调用内存警告更容易管理内存。

当您加载 PNG 图像时,数据将被解压缩并存储为每个像素的颜色数组。尽管图像中有内容/颜色,1K 纹理将使用 4 mb。 PVR是一个硬件解压芯片,当GPU使用图像时,它会实时解压,你看到的图像文件大小就是它使用的内存。

关于ios - 在 opengl es 2 中如何释放纹理(ios 硬崩溃),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327432/

相关文章:

iOS GLSL 球谐着色器。如何使用 iOS GPU 进行 Raycast

android - 在 Android 应用程序中处理 "Don' t 保留 Activity

ios - 在模拟器中模拟 Apple pencil 似乎是可行的

ios - 3D Touch View Controller For Location 未被调用

iPhone 应用架构

android - 着色器存储缓冲区对象 : endianness?

iphone - 将核心动画与 OpenGL ES 结合

java - 从文件加载数据会导致致命信号 11

c++ - 处理C++在iOS中导致崩溃

iphone - 如何处理进入和退出编辑模式的 UITableViewCell 中的 subview 大小调整?