正确删除纹理

时间:2011-02-08 01:23:31

标签: android opengl-es

当我在运行opengl es 1.1

的android上完成它时,我试图删除一个纹理

在Galaxy S(手机)和Droid X上,一切似乎都运转良好。事实上它的效果太好了,当我完成它时,我似乎甚至不需要删除纹理,我似乎永远不会耗尽内存......

在另一台设备上(目前不允许命名)似乎glDeleteTextures不起作用。加载6个大纹理(以及许多其他小纹理)后,无法加载新纹理,它们只是白色。

在nexus上,我有一个报告,它变成白色并抛出以下错误日志

  

E / Adreno200-EGL(632):eglLockWindowSurface:无法为fd = 37 offs = 4796416映射内存   E / Adreno200-EGL(632):eglLockWindowSurface:无法为fd = 38 offs = 1662976映射内存   E / Adreno200-EGL(632):eglLockWindowSurface:无法映射内存fd = 37 offs = 4796416   E / Adreno200-EGL(632):eglLockWindowSurface:无法为fd = 38 offs = 1662976映射内存   E / Adreno200-EGL(632):eglLockWindowSurface:无法映射内存fd = 37 offs = 4796416   E / Adreno200-EGL(632):eglLockWindowSurface:无法为fd = 38 offs = 1662976映射内存   E / Adreno200-EGL(632):eglLockWindowSurface:无法映射内存fd = 37 offs = 4796416   E / Adreno200-EGL(632):eglLockWindowSurface:无法映射内存以获得fd = 38 offs = 1662976

我远不是OpenGL的专家,但是: a)我找不到一个完整的例子来创建和删除纹理以确保我的代码是正确的 b)完全相同的方法在iPhone上完美运行

我唯一能想到的是我使用了相当多的线程,所以也许我的unbinds正在逃避正确的线程,或者在某种程度上没有正确计时。我目前没有任何有错误的硬件,所以在我自己拿到另一台设备之前我无法测试这个理论。

在删除纹理之前,您是否需要做任何特殊操作,或者您是否可以在流程中的任何位置滑动glDeleteTextures()并且它应该有效?

不发布任何示例代码的道歉,我目前对它有一些限制。

2 个答案:

答案 0 :(得分:3)

据我所知,所有OpenGL函数必须在创建设备的同一线程中调用。 OpenGL和OpenGL ES都适用。

答案 1 :(得分:0)

我似乎已经解决了这个问题。有些设备(不确定它是图形芯片组还是设备的其他设备)显然只能从图形上下文线程中删除纹理。在我的主纹理变量的清理调用中删除了我的纹理,这显然没有在正确的位置执行。现在我的glDeleteTexuters()在GLSurface下的一个事件中被qued,所以它在正确的上下文中在正确的线程中执行。

不确定它是否相关但是我遇到问题的设备会以线性顺序创建textureID(例如1,2,3,4然后我删除2,它会创建2,5,6等等)因为没有问题的星系S似乎会创建随机的纹理ID。可能表明芯片组如何处理纹理?只是一个猜测。