我正在用OpenGL 3和WinForms开发一个多线程的OpenTK应用程序。我有两个共享的GraphicsContexts:
此辅助上下文用于加载来自会话的视频帧(带有自定义媒体接收器)。但是,我无法控制这个媒体接收器运行在哪个线程上,因此在每次加载操作之后,我需要一种方法来“解除”该辅助GraphicsContext的绑定,以便将其绑定到需要它的下一个线程中。
我是否必须调用wglMakeCurrent(NULL,NULL),还是有一种正确的OpenTK方法来做到这一点?
发布于 2018-09-03 17:03:03
简短回答
使用OpenTK特性:
mycontext.MakeCurrent(null);长答案
今天的wglMakeCurrent文档已经删除了这句老话:
如果hglrc为NULL,则函数使调用线程的当前呈现上下文不再当前,并释放呈现上下文使用的设备上下文。在这种情况下,hdc被忽略。
我相信这个评论仍然有效,因为有那么多的代码依赖它。
注意“释放设备上下文”。也许OpenTK会执行一些与设备上下文相关的操作。也许hdc是私有的(通过使用窗口样式标志CS_OWNDC),所以让OpenTK来处理这个“空”情况。
更好的方法
请注意,即使您使用了几个共享上下文,GPU (通常是一个唯一的卡)进行加载,并且没有多少卡允许在执行其他工作时加载。因此,它不能保证您得到更好的性能。但是,在某种程度上,共享的语境是存在的。
为什么要在不同的线程中使用相同的上下文?
我会使用不同的线程加载视频帧(没有任何gl调用),并将它们上传到GPU。最后一个线程是永久性的,并且有它自己的gl上下文,所以它不需要每次工作时都设置为current。它会休眠或等待,直到另一个线程完成加载数据,而在完成该任务之后,它会将数据上传到GPU。
https://stackoverflow.com/questions/52151107
复制相似问题