首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在opengl es 2中,我如何释放纹理(ios硬崩溃)

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

Stack Overflow用户
提问于 2013-08-20 05:16:04
回答 1查看 1.1K关注 0票数 0

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

我的应用程序使用了大量的纹理,用于UI、图像处理等。我所使用的15种纹理中大约有4-5种是4Kx4k。休息时间更小。然后这些负载所需的纹理也是4k。

在加载这些程序的第4-5号左右时,应用程序很难崩溃。没有控制台或调试。只是在试着加载下一个纹理的过程中,离开跳板。

我没有记忆泄漏-我运行仪器。我在用ARC。我可以张贴事故报告,从组织者,但它没有太多的信息。只是我的应用程序的rpage是170504。

我可以发布图像加载代码,但它与我多年来在所有应用程序中使用的代码相同。新的东西是大力推动系统,并试图加载这么多的大纹理。

Q1:有人有使用大量大纹理的经验吗?

所以我决定,我必须在1024x1024预览res的内容,然后在4096完成res的最终操作。1k图像现在正在按需要加载并保持加载。所有4k图像都将一次一个加载到相同的纹理中使用,然后移动到下一个。

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

但是..。如果应用程序继续运行,因为我的纹理是在唯一的纹理if加载,在某个时候,我会到达一个点,我需要卸载一个不再需要加载下一个。这可能很简单但是..。

Q2:当我不再需要纹理id时,如何释放它的纹理? Q3:内存警告会告诉我我需要释放一个打开的gl纹理吗? Q4:纹理不是加载在PVR芯片上吗?他们是否或如何占用电话的记忆?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-20 05:56:10

删除纹理:您必须使用这个GL调用从主线程。

glDeleteTextures(1,&_texture);

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18327432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档