我在 iOS 中制作了一个小游戏,每当加载新模型时,都会在舞台上创建 VBO、IBO 和 VAO。当不再需要模型时,这些缓冲区将被释放。
缓冲区的创建和销毁总是在渲染循环开始时完成(我有一个线程,在游戏循环中跳帧)。
我以前只使用 VBO 和 VAO,它以前从未崩溃过,但是当我添加索引缓冲区对象 IBO 时,我突然开始遇到这些崩溃。
如果我不释放缓冲区,它不会崩溃,所以我猜模型仍在渲染中并且擦除缓冲区会导致它崩溃?但是,如果我只有一个线程,那怎么可能呢?顺便说一句,不过,我不会删除数据。所有的顶点和索引都是静态的。
这是我释放缓冲区的代码,当特定模型没有引用时调用该代码:
void ResourceModel::DeleteBuffers(uint16_t modelId)
{
glDeleteBuffers(1, &m_buffer[modelId]);
glDeleteBuffers(1, &m_bufferIBO[modelId]);
glDeleteVertexArraysOES(1, &m_geomVAOs[modelId]);
glDeleteVertexArraysOES(1, &m_primVAOs[modelId]);
}