我在这里遇到了一个奇怪的问题:我有一个潜在的大(高达 500mb)3d 纹理,每秒创建几次。纹理的大小可能会发生变化,因此并非每次都可以重用旧纹理。避免内存消耗的逻辑步骤是在每次不再使用纹理时删除纹理(使用 glDeleteTexture),但程序很快就会因读取或写入访问冲突而崩溃。当在我用来更新纹理的缓冲区上调用 glDeleteBuffer 时,也会发生同样的事情。
在我看来,这不可能发生,因为 glDelete* 函数非常安全。如果你给他们一个不是对应对象的 gl 句柄,他们就什么也不做。
有趣的是,如果我不删除纹理和缓冲区,程序运行良好,直到它最终耗尽显卡上的内存。
它运行在 Windows XP 32 位、NVIDIA Geforce 9500GT 和 266.58er 驱动程序上,Visual Studio 2005 中的编程语言是 c++。
更新
显然 glDelete 不是唯一受影响的功能。我刚刚在其他几种方法中遇到了违规行为(昨天不是这种情况)......看起来这里有些东西该死了。
更新 2
这不应该失败吗?
template <> inline
Texture<GL_TEXTURE_3D>::Texture(
GLint internalFormat,
glm::ivec3 size,
GLint border ) : Wrapper<detail::gl_texture>()
{
glGenTextures(1,&object.t);
std::vector<GLbyte> tmp(glm::compMul(size)*4);
glTextureImage3DEXT(
object, // texture
GL_TEXTURE_3D, // target
0, // level
internalFormat, // internal format
size.x, size.y, size.z, // size
border, // border
GL_RGBA, // format
GL_BYTE, // type
&tmp[0]); // don't load anything
}
失败:
Exception (first chance) at 0x072c35c0: 0xC0000005: Access violoation while writing to position 0x00000004.
Unhandled exception at 0x072c35c0 in Project.exe: 0xC0000005: Access violatione while writing to position 0x00000004.
最佳猜测:有什么东西弄乱了程序内存?