zoukankan      html  css  js  c++  java
  • opengl多线程的问题

      准备给游戏加入一个Loading画面,采用多线程,前面很顺利,但是就是载入后精灵无法正常显示,看不见纹理,开始以为是使用DevIL库出问题,单步调试发现DevIL载入图片正常,而opengl的glGenTextures出错了,返回的索引总是0。

    后来google在gamedev上找到答案,原来opengl不是线程安全的(不知道正确不?),找到了关键方向:wglCreateContext.

    后来在msdn上找到API解释,以及代码实例:

    HDC    hdc; 
    HGLRC  hglrc; 
     
    // create a rendering context  
    hglrc = wglCreateContext (hdc); 
     
    // make it the calling thread's current rendering context 
    wglMakeCurrent (hdc, hglrc);
     
    // call OpenGL APIs as desired ... 
     
    // when the rendering context is no longer needed ...   
     
    // make the rendering context not current  
    wglMakeCurrent (NULL, NULL) ; 
     
    // delete the rendering context  
    wglDeleteContext (hglrc);

    只要hdc一样,创建的context都会渲染到相同的设备上面

    但是实验很久,都没成功,最后发现是少了一个函数:wglShareLists(HGLRC  hglrc1, HGLRC  hglrc2)

    注:hglrc1分享hglrc2的资源

    // 创建多线程
    // 获取当前hdc
    HDC hDC = GetDC(hWnd);
    // 创建渲染context
    HGLRC hrc1 = wglCreateContext(hDC);
    // 分享资源
    wglShareLists(wglGetCurrentContext(), hrc1);
    ...
    ...
    // 载入资源的时候
    wglMakeCurrent(hDC,  hrc1);
    ...
    ...
    // 使用后
    wglMakeCurrent(NULL,  NULL);
    wglDeleteContext(hrc1);
    

  • 相关阅读:
    vue2.0 练习项目-外卖APP(2)
    vue2.0 练习项目-外卖APP(1)
    迈向全栈开发学习(3)
    迈向全栈开发学习(2)
    迈向全栈开发学习(1)
    前端到后台ThinkPHP开发整站(完)
    前端到后台ThinkPHP开发整站(7)
    前端到后台ThinkPHP开发整站(6)
    前端到后台ThinkPHP开发整站(5)
    uniapp 设置全局scss生效
  • 原文地址:https://www.cnblogs.com/shadow21/p/1937801.html
Copyright © 2011-2022 走看看