首页 > 解决方案 > 在多个线程之间共享 OpenGL 上下文

问题描述

我正在开发一个有很多场景的 OpenGL 项目。我已经成功实现了运行时切换场景的功能,因此用户可以通过ImGui菜单选择场景名称来切换到另一个场景。发生这种情况时,删除当前场景以清理脏的 OpenGL 内部状态,然后将从工厂模式加载新场景。一切正常,除了窗口会在过渡期间冻结几秒钟,因为卸载/加载场景需要很长时间才能完成。

我现在要做的是创建一个加载屏幕,它将显示在两者之间。卸载/加载场景的任务是使用std::async和异步调度std::future的,因此调用者是非阻塞的,并且可以显示我的加载屏幕。但是,由于我在另一个线程的后台创建新场景,该线程无法在主线程中看到 OpenGL 上下文,因此,任何glxxxx()调用都会导致访问冲突,因此无法创建新场景。

我知道 OpenGL 是一个全局状态机,它不能很好地支持多线程。我还在某处读到它依赖于驱动程序。这个话题的大部分线程都老了,不知道到2021年在OpenGL中使用多线程是否仍然困难。据我所知,加载屏幕和切换场景只是非常基本的功能,很多应用程序都可以这样做,而我相信有很多他们使用OpenGL,为什么这个问题今天仍然没有得到普遍解决?

有谁知道这方面的任何外部库?或者是否有另一种不使用多个线程的解决方法?

标签: c++multithreadingopengl

解决方案


推荐阅读