【问题标题】:multi-threading support in soil for openglopengl 在土壤中的多线程支持
【发布时间】:2013-10-13 03:57:35
【问题描述】:

我的问题是,SOIL(简单的 opengl 图像库)线程兼容吗?

因为当我运行以下代码时:

Texture = SOIL_load_OGL_texture (
                 loc.c_str(),
                 SOIL_LOAD_AUTO,
                 SOIL_CREATE_NEW_ID,
                 SOIL_FLAG_POWER_OF_TWO
                 | SOIL_FLAG_MIPMAPS
                 | SOIL_FLAG_MULTIPLY_ALPHA
                 | SOIL_FLAG_COMPRESS_TO_DXT
                 | SOIL_FLAG_DDS_LOAD_DIRECT
                 | SOIL_FLAG_INVERT_Y
             );

(为了加载纹理)

在线程外它工作正常,但是当在 std::thread 内运行时,它会给我错误

Project2.exe 中 0x592527FF (msvcr110d.dll) 处的未处理异常: 0xC0000005:访问冲突读取位置0x00000000。

我希望能够对它进行线程化,以便它可以在菜单屏幕、启动屏幕或类似的情况下加载。所以我的问题是,如果 SOIL 不是线程安全的,那么一个不错的解决方案是运行一个线程来运行菜单/启动屏幕/其他任何东西以允许纹理加载到主线程中?

【问题讨论】:

  • 与其说 SOIL 是否是线程安全的,不如说是你的工作线程中是否有一个有效的 OpenGL 上下文。窗口系统只允许在任何给定时刻将 OpenGL 渲染上下文绑定到单个线程,这可以通过放弃单个上下文并在线程之间传递它(同步开销使这是一个坏主意)或使用多个上下文来解决共享资源。无论如何,如果您尝试在没有 OpenGL 上下文绑定的线程中使用 OpenGL 命令的结果,就会发生这种事情。
  • 我敢打赌,您(或其他人)没有正确编译 SOIL 以在多线程程序中使用。

标签: c++ multithreading opengl thread-safety soil


【解决方案1】:

OpenGL 是线程绑定的!这意味着您可以一次从单个线程调用您的 GL 上下文。(感谢 datenwolf 的更正)如果上述方法使用 GL 方法,我想它确实如此,那么它就赢了除非你在单独的 GL 上下文中执行,否则它不起作用。如果你想采用多线程方式,你可以创建共享上下文 - 每个都在单独的线程中。然后你在主线程中渲染,同时在另一个线程中加载纹理。我是不知道它在性能方面有多好,但无论如何你都可以尝试一下。

【讨论】:

  • OpenGL 并不是真正的单线程,它是线程绑定。 IE。在任何时候,一个给定的 OpenGL 上下文只能从一个线程中使用。但是,可以在线程之间迁移上下文。并且可以从进程的所有线程访问缓冲区对象映射。
猜你喜欢
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多