首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenTK MultiThreading:如何“解除”GraphicsContext

OpenTK MultiThreading:如何“解除”GraphicsContext
EN

Stack Overflow用户
提问于 2018-09-03 13:49:54
回答 1查看 718关注 0票数 0

我正在用OpenGL 3和WinForms开发一个多线程的OpenTK应用程序。我有两个共享的GraphicsContexts:

  • 一种“主要”呈现上下文,用于绘制场景和同步加载操作。
  • “辅助”资源加载器上下文,用于在绘制期间加载资源。

此辅助上下文用于加载来自会话的视频帧(带有自定义媒体接收器)。但是,我无法控制这个媒体接收器运行在哪个线程上,因此在每次加载操作之后,我需要一种方法来“解除”该辅助GraphicsContext的绑定,以便将其绑定到需要它的下一个线程中。

我是否必须调用wglMakeCurrent(NULL,NULL),还是有一种正确的OpenTK方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-03 17:03:03

简短回答

使用OpenTK特性:

代码语言:javascript
复制
mycontext.MakeCurrent(null);

长答案

今天的wglMakeCurrent文档已经删除了这句老话:

如果hglrc为NULL,则函数使调用线程的当前呈现上下文不再当前,并释放呈现上下文使用的设备上下文。在这种情况下,hdc被忽略。

我相信这个评论仍然有效,因为有那么多的代码依赖它。

注意“释放设备上下文”。也许OpenTK会执行一些与设备上下文相关的操作。也许hdc是私有的(通过使用窗口样式标志CS_OWNDC),所以让OpenTK来处理这个“空”情况。

更好的方法

请注意,即使您使用了几个共享上下文,GPU (通常是一个唯一的卡)进行加载,并且没有多少卡允许在执行其他工作时加载。因此,它不能保证您得到更好的性能。但是,在某种程度上,共享的语境是存在的。

为什么要在不同的线程中使用相同的上下文?

我会使用不同的线程加载视频帧(没有任何gl调用),并将它们上传到GPU。最后一个线程是永久性的,并且有它自己的gl上下文,所以它不需要每次工作时都设置为current。它会休眠或等待,直到另一个线程完成加载数据,而在完成该任务之后,它会将数据上传到GPU。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52151107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档