另一个实例上的OpenGL视图释放(glDeleteFramebuffers)副作用 [英] OpenGL view deallocation (glDeleteFramebuffers) side-effect on another instance

查看:982
本文介绍了另一个实例上的OpenGL视图释放(glDeleteFramebuffers)副作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我保留了一个opengl视图的多个实例。当我释放/删除一个视图实例时,它会影响帧缓冲区和opengl视图的所有其他实例的渲染缓冲区。我观察到对glDeleteFrameBuffer的调用删除了所有的帧缓冲区



我创建了一个小项目来演示我的问题,可以从 GLEssentials_ModifiedToDemonstrateProblem.zip - Google云端硬盘 [ ^ ]



两个视图(EAGLView)是添加到屏幕(viewcontroller)。

帧缓冲状态按钮打印每个视图的缓冲区状态,如:showFrameBufferStatus:glIsFramebuffer return true

删除按钮从视图层次结构中删除视图因此从内存中取消分配视图。





重新生成问题的步骤:



第1步:

下载并运行演示项目(我使用的是XCode 7.2 - IOS 8.4)



第2步:

触摸第二个视图的帧缓冲状态按钮。

它将showFrameBufferStatus:glIsFramebuffer return true打印到控制台。



第3步:

触摸第一个视图的删除按钮。它从视图层次结构中删除第一个视图,并为EAGLView和ES2Renderer调用dealloc



步骤4:

触摸第二个视图的帧缓冲状态。

打印showFrameBufferStatus:glIsFramebuffer return false。这意味着当view1被释放时,view2的帧缓冲区被删除。





现在当ES2Renderer.m及以上版本中注释了glDeleteFramebuffers时按照步骤,最后一步显示glIsFramebuffer返回true



  //   glDeleteFramebuffers(1,& defaultFBOName);  





因此root问题是glDeleteFramebuffers删除ES2Render两个实例的帧缓冲区。



注意:该项目是通过修改来自apple的GLEssential演示创建的( https://developer.apple.com/library/ios/samplecode/GLEssentials/Introduction/Intro.html [<一个href =https://developer.apple.com/library/ios/samplecode/GLEssentials/Introduction/Intro.html\"target =_ blanktitle =New Window> ^ ])

解决方案

得到解决方案。

在调用glDeleteFramebuffers之前,需要设置当前上下文。以下代码修复了我的问题:

 [EAGLContext setCurrentContext: self  .context]; 
glDeleteFramebuffers( 1 ,& defaultFBOName);


I am keeping multiple instances of an opengl view. When I release/remove one instance of view, it affects frame buffers and render buffers of all other instances of opengl view. I observed that call made to glDeleteFrameBuffer deletes frame buffer for all

I have created a small project to demonstrate my problem, which can be downloaded from GLEssentials_ModifiedToDemonstrateProblem.zip - Google Drive[^]

Two views (EAGLView) are added to the screen (viewcontroller).
"Frame Buffer Status" buttons prints status of buffers of each views like: "showFrameBufferStatus: glIsFramebuffer returned true"
"Remove" button removes view from view hierarchy. Hence deallocating the view from memory.


Steps to regenerate the problem:

Step 1:
Download and run the demo project (I used XCode 7.2 - IOS 8.4)

Step 2:
Touch the button "Frame Buffer Status" for second view.
It prints "showFrameBufferStatus: glIsFramebuffer returned true" to console.

Step 3:
Touch the button "Remove" for first view. It removes first view from view hierarchy and dealloc gets called for EAGLView and ES2Renderer

Step 4:
Touch "Frame Buffer Status" for second view.
It prints "showFrameBufferStatus: glIsFramebuffer returned false". It means frame buffer is deleted for view2 while view1 is deallocated.


Now when glDeleteFramebuffers is commented out in ES2Renderer.m, and above steps are followed, final step shows that glIsFramebuffer returned true

//glDeleteFramebuffers(1, &defaultFBOName);



So root problem is glDeleteFramebuffers deletes frame buffers for both instances of ES2Render.

Note: The project is created by modifying GLEssential demo from apple (https://developer.apple.com/library/ios/samplecode/GLEssentials/Introduction/Intro.html[^])

解决方案

got solution.
Before calling glDeleteFramebuffers, it is required to do set current context. following code fixed problem for me:

[EAGLContext setCurrentContext:self.context];
glDeleteFramebuffers(1, &defaultFBOName);


这篇关于另一个实例上的OpenGL视图释放(glDeleteFramebuffers)副作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆