基本上,在我的代码中,我挂钩了glDeleteTextures和glBufferData函数。我存储纹理列表和缓冲区列表。缓冲区列表包含校验和和指向缓冲区的指针。以下代码在数据到达图形卡之前拦截数据。
Hook_glDeleteTextures(GLsizei n, const GLuint* textures)
{
for (int I = 0; I < n; ++I)
{
if (ListOfTextures[I] == textures[I]) //??? Not sure if correct..
{
//Erase them from list of textures..
}
}
(*original_glDeleteTextures)(n, textures);
}
我为缓冲区做同样的事情。我将缓冲区和纹理保存到如下列表中:
void Hook_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
{
Buffer.size = size;
Buffer.target = target;
Buffer.data = data;
Buffer.usage = usage;
ListOfBuffers.push_back(Buffer);
(*original_glBufferData(target, size, data, usage);
}
现在我需要在客户端删除时删除。我怎样才能做到这一点?我使用了调试器,它似乎确切地知道正在删除哪些纹理和缓冲区。
我做错了吗?我应该迭代传递的指针并删除纹理吗?
答案 0 :(得分:1)
你会意识到,你应该反过来:拥有一个纹理信息对象列表,当你删除其中一个时,调用OpenGL删除纹理。 BTW:OpenGL调用不会转到显卡,它们会转到驱动程序,纹理可能根本不会存储在GPU内存中,而是可以换成系统内存。
我做错了吗?我应该迭代传递的指针并删除纹理吗?
是。您不应该拦截OpenGL调用来触发程序中的数据管理。首先,您还必须跟踪活动的OpenGL上下文。但更重要的是,这是你的程序首先进行OpenGL调用。除非您的程序/编译器/ CPU是精神分裂的,否则应该更容易首先跟踪数据并根据此管理OpenGL对象。另外通常的方法是将纹理图像数据保存在缓存中,但如果您现在不需要它们,则删除这些图像的OpenGL纹理,但在不久的将来可能需要它们。
你的方法基本上由内而外,你把车放在马前。