Nic*_*uet 5 .net opengl multithreading garbage-collection finalizer
我即将围绕 OpenGL 纹理实现一个托管包装类,并且我希望对象终结器调用glDeleteTextures
.
因此,调用终结器的线程(GC线程?)必须通过调用绑定到纹理所属的OpenGL渲染上下文wglMakeCurrent
。
但wglMakeCurrent
文档明确指出,一个OpenGL渲染上下文不能同时是多个线程的当前渲染上下文。
如果GC可以随时触发,我不能保证发生时没有其他线程正在使用上下文。
glDeleteTextures
调用 .net 对象的终结器的正确方法是什么?
编辑
该包装类将用于“按需加载”场景图的复杂系统,并通过WeakReference
等等实现缓存策略。因此,“手动处置”不是我想要考虑的选项:我真的希望 GC 能够处理这个问题。
你不知道。
使用该IDisposable
接口使释放具有确定性。当释放纹理对象时,调用该dispose
方法。在里面,删除纹理。
这适用于分配非托管资源的所有对象;在本例中,由 OpenGL 处理。
好的,这就是我所做的。
我实施了IDisposable
我在资源对象(纹理、顶点数组、着色器等的基类)上
处置时时(或者如果未手动处置则最终确定),资源将其 id 和类型添加到其 OpenGL 上下文包装类拥有的同步列表中,并最终通过设置事件唤醒主线程。
我已经更改了我的应用程序消息泵(我现在使用MsgWaitForMultipleObjects
而不是GetMessage
),并且在循环中,一旦获取了 OpenGL 上下文,线程首先“释放”未使用的资源,然后再处理消息(如果有)。
到目前为止,它就像一个魅力。
感谢 Stefan Hanke 对此的提示!
归档时间: |
|
查看次数: |
1124 次 |
最近记录: |