用于操作的土壤中的多线程支持

时间:2013-10-13 03:57:36

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

我的问题是,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不是线程安全的那么一个体面的解决方案是运行一个线程来运行菜单/启动画面/无论为了允许纹理加载到主线程?

1 个答案:

答案 0 :(得分:1)

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