码迷,mamicode.com
首页 > 其他好文 > 详细

关于WGL扩展的一些非官方指南

时间:2015-02-13 00:15:28      阅读:452      评论:0      收藏:0      [点我收藏+]

标签:

       大家好啊,作为失踪人口的我又出现了,鲜花和掌声我就不要了,我挖了个坑,不仅没填,挖了一半就不挖了,我对自己感到很绝望,其实为什么不写blog,不是没得写,其实就是我太懒了,今天写的也不是什么干货,只是一些不被人注意的小东西,OpenGL真的是一个很大很大的坑,不想找虐的就不要乱跳进来了,DX大法好是吧!

  其实我失踪的这段时间也不是什么都没干,很明显我是一个很努力的人。好吧,我又无耻了是吧,今天写的是前段时间发现一个问题之后牵扯出来的问题,就是WGL扩展,其实这个东西本身没什么好讲的,蓝宝书第十三章上讲的挺清楚明白了。本来呢我也觉得这东西没什么好讲的,结果就被坑了。苦恼了一段时间甚至导致我把现在的框架又进行了大面积重构,那就不说了,说多了都是泪了,好了,开始讲讲问题到底是什么。

  有很多童鞋呢,入门使用的框架都是glut或者其他现场的跨平台框架,所以我相信关于WGL扩展的部分接触的并不多,我先做一下扫盲,WGL扩展说白了是Windows操作系统和OpenGL做交互的一系列扩展,glut也好,其他框架也好,都是对这些接口进行了封装。之前的文章也提到了,Windows在对OpenGL的原生支持非常不友好,甚至差点就夭折了,在wingdi.h这个头文件中是有一堆接口用于创建OpenGL Render Context的,但是使用这些API创建的版本非常低,好像也就1.1~1.4的样子,而且还是软件实现,总之是非常不友好,所以就有ICD架构这个东西,类似于一个对于OpenGL32.dll的插件,ICD这个东西在你的显卡驱动里,比如N卡的nvoglv32.dll,A卡的atioglxx.dll是吧,反正ICD是个很神奇的东西,没有它在Windows上想用完整的OpenGL就不可能了对吧,更新驱动保平安,切记。

  之后,让我来说说Render Context创建的流程,首先你得有个窗口handle也就是HWND,毕竟是和窗口去交互的,然后获得窗口的Device Context Handle也就是HDC,然后从DC中选择一个合适OpenGL的像素格式,将这个格式设置为窗口格式,然后创建HGLRC,这样RC就创建成功了,过程很死板也很简单,加了WGL扩展之后也只是扩展了一些新的像素格式,本质上没变,用的两个主要扩展WGL_ARB_pixel_format和WGL_ARB_create_context来替代原本Windows自带的那些接口就能创建高级的RC来满足我们的条件。奶奶的,坑就坑在这里了,在写了一段时候发现我的程序启动非常慢非常慢非常慢,据我目测大概要两秒才能全部初始化完成,那我用的IDE是VS2013,心血来潮就用自带的分析工具分析了一下执行过程的时间占用,分析结果萌了我一脸,首先是glew的初始化占用了接近1%的时间,这个不说了,看了代码发现,这货初始化干的事情就是把所有扩展搜索然后初始化一遍,方法很low,所以慢没办法,但是要用它就得忍受它是吧,所以这个撇开不管,最占用时间的是SwapBuffer的调用,这个也没什么好说的,我开着垂直同步,并且隐式同步等情况,等待是正常的。然后重点来了,占用%37的神奇函数拖垮了整体调用时间,wglChoosePixelFormatARB,就是这货,也就是我所说的坑,这函数奇慢,为什么慢我也不知道,但是就是奇慢,慢咋办,改呗还能咋办。所以我参考了glfw这个框架,这个框架本身没什么好说的,但是它很快,启动的非常快,我就仔细的研究了一下,好了该说到重点了。

  对于WGL_ARB_pixel_format这个扩展,其中提供了三个函数,Choose和2个Get属性的函数,在GLFW这个框架中避开了Choose这个神慢的函数,这种方式在super bible中也有讲,不过一句话也就带过去了,并没有说到这种方式对性能带来的好处。这个初始化的方式带来一个好处是进行了粗粒度的像素格式过滤从而加快了速度(反正我是这么觉得的),方式上就是从所有像素格式中选取可以支持OpenGL的像素格式,然后自己进行匹配,标准的Choose其实也是做了这个事,但是很明显粒度会更加精细,所以拖垮了时间,对于一个轻巧的小型框架来说,一个严重延迟的初始化程序绝对是不能忍的,其实大型引擎里也应该做这步优化,像素过滤的粒度当然自己控制就好了。所以我这里给出的建议是放弃标准Choose函数,让你的程序又能装逼又能飞。

  至于其他的扩展,其实用扩展查看程序查一下,会发现,其实保留的WGL扩展并不多了,也就那么几个,而且大部分都是没用的,比如PBuffer,context_flush_control这些,都是历史遗留下来的东西,真的不要去关注就好了,正经关注的就是WGL_ARB_pixel_format和WGL_ARB_create_context这俩,还有一个挺重要的大概是WGL_EXT_swap_control这个扩展,这个扩展可以用来打开和关闭垂直同步,让你的程序飞起来,N卡下垂直同步是默认打开的,这个用Nsight看一下就可以了。其他的真的不要去关注比较好,关注给自己找不自在,过年了,大家还是开心点毕竟好。

  新年快乐:)

关于WGL扩展的一些非官方指南

标签:

原文地址:http://www.cnblogs.com/frank-cg-pie/p/4289352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!