我正在使用OpenTK 3和WinForms开发多线程OpenGL应用程序。 我有2个共享的GraphicsContexts:
此辅助上下文用于加载来自Windows Media Foundation会话(带有自定义媒体接收器)的视频帧。但是,我无法控制此媒体接收器在哪个线程上运行,因此我需要一种在每次加载操作之后“解除绑定”该辅助GraphicsContext的方法,以便可以将其绑定在需要该线程的下一个线程中
我是否必须P /调用wglMakeCurrent(NULL,NULL)或是否有适当的OpenTK方式来做到这一点?
答案 0 :(得分:1)
使用OpenTK功能:
mycontext.MakeCurrent(null);
今天的wglMakeCurrent doc已消除了这一旧评论:
如果hglrc为NULL,则函数使调用线程为当前 渲染上下文不再是当前的,并释放设备上下文 呈现上下文使用的内容。在这种情况下,hdc将被忽略。
我相信注释仍然有效,因为有太多代码依赖于此注释。
请注意“释放设备上下文” 。也许OpenTK会执行一些与设备上下文有关的操作。也许 hdc 是私有的(通过使用窗口样式标志CS_OWNDC
),所以让OpenTK处理这种“ NULL”情况。
请注意,即使使用多个共享上下文,GPU(通常是一张唯一的卡)也可以进行加载,并且在执行其他作业时也没有多少卡可以加载。因此,不能保证您获得更好的性能。但是出于某种目的存在共享上下文。
为什么要在不同的线程中使用相同的上下文?
我将使用其他线程来加载视频帧(不进行任何gl-call调用)并将其上传到GPU。最后一个线程是 permanent ,并具有其自己的gl上下文,因此不必每次工作时都将其设置为最新。它会休眠或等待,直到另一个线程完成了数据加载,并在该任务完成后将数据上传到GPU。