在realize()前打开预编译选项指令:

osg::DisplaySettings::instance()->setCompileContextsHint(true);   
mpr_osgviewer->realize();

显示如下信息:

此时虽然trait::shareContext变量有了值,但是实际上其共享渲染描述表句柄hglrc是没有创建成功的。

我试图自己创建opengl图形共享上下文hglrc以实现多线程预编译显示列表,避免帧冲击,可惜无法成功。

osg::GraphicsContext* gc = mpr_osgviewer->getCamera()->getGraphicsContext();

osgViewer::GraphicsWindowWin32* gw = dynamic_cast<osgViewer::GraphicsWindowWin32*>(gc);
 if (gw)
 {                                    
    HGLRC _sharehglrc = 0;
    bool succ = gc->makeCurrent();
    HGLRC hglrc = gw->getWGLContext();
    bool succ2 = ::wglShareLists(hglrc,_sharehglrc);

succ2返回值是false,wglShareLists失败,_sharehglrc仍然为空。

查询了本机的GL_VERSION,发现是4.0,高于1.01版,按照函数说明不应该返回错误的。

从网上现有的信息看  好像现在window下osg使用多线程预编译显示列表确实是有问题的,由于没有能成功创建共享渲染描述表句柄,所以没有编译绘制线程存在。

http://bbs.osgchina.org/forum.php?mod=viewthread&tid=2836

没有CompileContext的话,DatabasePager本身就不会执行预编译。那么这个时候预编译工作实际上是由Renderer代为完成的:

如果没有定义CompileContext的话,那么此处将自动处理databasePager中等待编译的数据。

Windows下的CompileContext一直有问题不能正常使用,因此setDoPreCompile将直接使用Renderer进行预编译工作

实际是在渲染线程中做的预编译,占用了渲染时间,不是真正的多线程编译显示列表。

暂时是束手无策了。

查询osg论坛得知shareContext目前在Linux+nvidia显卡环境下ok,windows环境时是有问题的。

http://forum.openscenegraph.org/viewtopic.php?t=6638&highlight=

追加新的尝试及结果:

使用nehe教程中的lesson7例子中自己加入创建共享渲染描述表代码wglShareLists,是能返回成功值得。

然后将此段代码移植到osg的源代码中替换相关创建hglrc代码(修改osgViewer::Win32WindowingSystem::createGraphicsContext(traits)--->setWindow(hwnd))

代码执行测试发现使用wglShareLists创建共享渲染描述表 成功。。。。。。%>_<% %>_<%

static    PIXELFORMATDESCRIPTOR pfd=                // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),                // Size Of This Pixel Format Descriptor
        1,                                            // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                            // Must Support Double Buffering
        PFD_TYPE_RGBA,                                // Request An RGBA Format
        16,                                            // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                            // Color Bits Ignored
        0,                                            // No Alpha Buffer
        0,                                            // Shift Bit Ignored
        0,                                            // No Accumulation Buffer
        0, 0, 0, 0,                                    // Accumulation Bits Ignored
        16,                                            // 16Bit Z-Buffer (Depth Buffer)  
        1,                                            // Use Stencil Buffer ( * Important * )
        0,                                            // No Auxiliary Buffer
        PFD_MAIN_PLANE,                                // Main Drawing Layer
        0,                                            // Reserved
        0, 0, 0                                        // Layer Masks Ignored
    };

int PixelFormat = ChoosePixelFormat (_hdc, &pfd);                // Find A Compatible Pixel Format
    if (PixelFormat == 0)                                                // Did We Find A Compatible Format?
    {
        // Failed
        ReleaseDC (_hwnd, _hdc);                                    // Release Our Device Context
        _hdc = 0;                                                // Zero The Device Context
        DestroyWindow (_hwnd);                                    // Destroy The Window
        
        _hwnd = 0;                                                // Zero The Window Handle
        return false;                                                    // Return False
    }

if(!SetPixelFormat(_hdc,PixelFormat,&pfd))        // Are We Able To Set The Pixel Format?
    {
        //KillGLWindow();                                // Reset The Display
        MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
        return false;                                // Return FALSE
    }

_hglrc = wglCreateContext(_hdc);

HGLRC        hRCShareing=wglCreateContext(_hdc);// 用于分享hRC的资源2010.8.9
    bool res = wglShareLists(_hglrc, hRCShareing);

可惜的是 在另一个线程编译显示列表和纹理对象时会和osg本身流程中的显示列表和纹理对象管理有资源冲突(线程资源访问冲突).

尝试使用Osg共享渲染描述表(HGLRC)实现多线程编译显示列表--总结的更多相关文章

  1. IDT系统中断描述表以及绕过Xurtr检测的HOOK姿势

    什么是中断?  指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程.即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个 ...

  2. Vue3组件(九)Vue + element-Plus + json = 动态渲染的表单控件

    一个成熟的表单 表单表单,你已经长大了,你要学会: 动态渲染 支持单列.双列.多列 支持调整布局 支持表单验证 支持调整排列(显示)顺序 依据组件值显示需要的组件 支持 item 扩展组件 可以自动创 ...

  3. 《图解UE4渲染体系》Part 1 多线程渲染

    上回书<Part 0 引擎基础>说到,我们粗略地知道UE4是以哪些类来管理一个游戏场景里的数据的,但这仅仅是我们开始探索UE4渲染体系的一小步. 本回主要介绍UE4渲染体系中比较宏观顶层的 ...

  4. “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”

    自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...

  5. Servlet的线程是不是共享同一个requset对象及servlet多线程

    servlet多线程   一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组 ...

  6. osg for android学习之一:windows下编译(亲测通过)【转】

    1. 首先需要一个OSG for android的环境 (1)NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一):新 ...

  7. .NET MVC+ EF+LINQ 多表联查VIEW显示列表

    1.VIEW 页面显示代码 <link href="~/Content/bootstrap.css" rel="stylesheet" /> < ...

  8. 【Excle数据透视表】如何水平并排显示报表筛选区域的字段

    原始效果 目标效果 解决方案 设置数据透视表"在报表区域筛选显示字段"为"水平并排" 步骤 方法① 单击数据透视表任意单元格→数据透视表工具→分析→选项→布局和 ...

  9. zencart批量表上传后 标题显示为网址 批量修改标题状态 SEO三要素

    zencart批量表上传后 标题显示为网址,原因是导入批量表时,产品标题对应状态被重置为0导致的 批量修改标题状态 ', metatags_products_name_status ', metata ...

随机推荐

  1. dotfiles项目

    1.dotfile介绍 在linux中的各种软件配置文件大多是以.开头,以rc结尾,在第一次使用某一个软件比如vim的时候,通常会花大量时间配置,将所有的配置文件放到同一个目录下,方便在多台机器上同步 ...

  2. Windows下Git多账号ssh-key(复制自己用)

    Windows下Git多账号配置,同一电脑多个ssh-key的管理 这一篇文章是对上一篇文章<Git-TortoiseGit完整配置流程>的拓展,所以需要对上一篇文章有所了解,当然直接往下 ...

  3. sqlserver把bak备份还原到另一个数据库

    1.新建数据库aa 2.选择还原数据库,在选项下选择“覆盖现有数据库”即可

  4. 【bzoj2789】[Poi2012]Letters 树状数组求逆序对

    题目描述 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. 输入 第一行一个正整数n ...

  5. css对html中表格单元格td文本过长的处理

    参考 http://www.cnblogs.com/lekko/archive/2013/04/30/3051638.html http://www.zhangxinxu.com/wordpress/ ...

  6. ZigBee学习五 无线温度检测

    ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...

  7. P2647 最大收益 (动态规划)

    题目链接 Solution 乍一看发现正着 DP,有明显的后效性,所以就反过来做. 但是同时发现很显然减去多的放后面明显更优,所以按 \(R\) 从大排序. 然后 \(f[i][j]\) 代表前 \( ...

  8. javaScript 笔记(4) -- 弹窗 & 计时事件 & cookie

    弹窗 可以在 JavaScript 中创建三种消息框:警告框.确认框.提示框. 警告框:经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. 语法: window ...

  9. Eclipse 无法查看第三方jar包文件源代码解决方法

    1.打开第三方依赖包,源文件的快捷键:ctrl + mouseClick 2.由于我们下载的第三方jar 包,如Spring等相关的依赖包时,并没有附加下载相应的源文件,所以经常出现如图的这种问题. ...

  10. 关于Struts2中param的作用

    1.页面传参与配置传参的区别: 如果页面Form表单的参数在Action类中有相应的setter方法,则会优先取页面Form表单传过来的值,如果页面没有该属性同名的参数,则会从配置文件中取同名的参数值 ...