尝试使用Osg共享渲染描述表(HGLRC)实现多线程编译显示列表--总结
在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)实现多线程编译显示列表--总结的更多相关文章
- IDT系统中断描述表以及绕过Xurtr检测的HOOK姿势
什么是中断? 指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程.即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个 ...
- Vue3组件(九)Vue + element-Plus + json = 动态渲染的表单控件
一个成熟的表单 表单表单,你已经长大了,你要学会: 动态渲染 支持单列.双列.多列 支持调整布局 支持表单验证 支持调整排列(显示)顺序 依据组件值显示需要的组件 支持 item 扩展组件 可以自动创 ...
- 《图解UE4渲染体系》Part 1 多线程渲染
上回书<Part 0 引擎基础>说到,我们粗略地知道UE4是以哪些类来管理一个游戏场景里的数据的,但这仅仅是我们开始探索UE4渲染体系的一小步. 本回主要介绍UE4渲染体系中比较宏观顶层的 ...
- “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”
自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...
- Servlet的线程是不是共享同一个requset对象及servlet多线程
servlet多线程 一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组 ...
- osg for android学习之一:windows下编译(亲测通过)【转】
1. 首先需要一个OSG for android的环境 (1)NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一):新 ...
- .NET MVC+ EF+LINQ 多表联查VIEW显示列表
1.VIEW 页面显示代码 <link href="~/Content/bootstrap.css" rel="stylesheet" /> < ...
- 【Excle数据透视表】如何水平并排显示报表筛选区域的字段
原始效果 目标效果 解决方案 设置数据透视表"在报表区域筛选显示字段"为"水平并排" 步骤 方法① 单击数据透视表任意单元格→数据透视表工具→分析→选项→布局和 ...
- zencart批量表上传后 标题显示为网址 批量修改标题状态 SEO三要素
zencart批量表上传后 标题显示为网址,原因是导入批量表时,产品标题对应状态被重置为0导致的 批量修改标题状态 ', metatags_products_name_status ', metata ...
随机推荐
- 《HTTP协议详解》读书笔记---请求篇之消息报头
不管是请求消息还是响应消息都包含消息报头,那么消息报头包含哪些内容?他们都代表什么含义呢?以下将带着 这些问题去学习消息报头. http消息(不管是请求消息还是响应消息)都是由开始行,消息报头(可选) ...
- CSU-2116 Polyline Simplification
CSU-2116 Polyline Simplification Description Mapping applications often represent the boundaries of ...
- python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序
去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...
- Leetcode 488.祖玛游戏
祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串球中 ...
- [oldboy-django][2深入django]MVC&MTV
# MVC和MTV MVC = models(数据库) + views(模板html) + controllers(业务逻辑处理) MTV = models(数据库) + template(模板htm ...
- Fragment控件初始化
代码改变世界 Fragment控件初始化 @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup ...
- 异常为"当IDENTITY_INSERT设置为OFF时" 解决办法
当 IDENTITY_INSERT 设置为 OFF 时,不能向表"A" 中的标识列插入显示值. 一般来说是自增ID造成的. 因此可以在数据库insert语句前加上 SET iden ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- 论文笔记《Notes on convolutional neural networks》
这是个06年的老文章了,但是很多地方还是值得看一看的. 一.概要 主要讲了CNN的Feedforward Pass和 Backpropagation Pass,关键是卷积层和polling层的BP推导 ...
- C++ 静态成员的类内初始化
一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #includ ...