6.5vol|dl轻度阳痿怎么办读

4990人阅读
&& &这是SDL中我最关心的模块,即SDL是怎么抽象渲染模块的接口然后实现跨平台的,已经在DirectX/OpenGL中绘制图形的。
&&& 本文与前面两篇使用不同的描述方式,前面两篇文章以结构性的铺开分析为主,本文决定使用流程分析。
SDL+OpenGL
&& &对于OpenGL版本,由于主要的绘制都是由OpenGL的API来完成,与SDL关系并不大,所以只看SDL_SetVideoMode
的时候,我很惊讶的发现,即使是在SDL使用了DirectX版本的video driver后,仍然可以使用OpenGL来完成渲染。关键点在SDL_SetVideoMode
函数上,先看此函数。
使用OpenGL时,用以下方式调用此函数:
SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 16, SDL_OPENGL);
即最后一个参数为SDL_OPENGL。
此时,最后使用DirectX来渲染还是使用OpenGL来渲染,最大的不同自然在于surface的创建,
在SDL_SetVideoMode中会有这么一句:
mode = video-&SetVideoMode(this, prev_mode,video_w,video_h,video_bpp,flags);
即使用当前video driver来设置video mode,由于我已经选中了directX的video driver了,所以实际调用的是:
SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current,
&& &&& &&& &&& &int width, int height, int bpp, Uint32 flags)
此函数中,有这么一段代码:
&If we are setting a GL mode, use GDI, not DirectX (yuck)
&( flags & SDL_OPENGL ) {
&&&&&&&&Uint32 Rmask, Gmask, B
&&&&&&&&/*
&Recalculate the bitmasks if necessary
&&&&&&&&if
&( bpp == current-&format-&BitsPerPixel ) {
&&&&&&&&&&&&video =
&&&&&&&&} else
&&&&&&&&&&&&switch
&&&&&&&&&&&&&&&&case
&&&&&&&&&&&&&&&&case
&&&&&&&&&&&&&&&&if
DIB_SussScreenDepth() == 15
&&&&&&&&&&&&&&&&&&&&/*
&&&&&&&&&&&&&&&&&&&&Rmask = 0x00007c00
&&&&&&&&&&&&&&&&&&&&Gmask = 0x
&&&&&&&&&&&&&&&&&&&&Bmask = 0x0000001f
&&&&&&&&&&&&&&&&} else
&&&&&&&&&&&&&&&&&&&&/*
&&&&&&&&&&&&&&&&&&&&Rmask = 0x
&&&&&&&&&&&&&&&&&&&&Gmask = 0x
&&&&&&&&&&&&&&&&&&&&Bmask = 0x0000001f
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&break
&&&&&&&&&&&&&&&&case
&&&&&&&&&&&&&&&&case
&&&&&&&&&&&&&&&&/*
&GDI defined as 8-8-8
&&&&&&&&&&&&&&&&Rmask = 0x00ff0000
&&&&&&&&&&&&&&&&Gmask = 0x0000ff00
&&&&&&&&&&&&&&&&Bmask = 0x000000ff
&&&&&&&&&&&&&&&&break
&&&&&&&&&&&&&&&&default
&&&&&&&&&&&&&&&&Rmask = 0x
&&&&&&&&&&&&&&&&Gmask = 0x
&&&&&&&&&&&&&&&&Bmask = 0x
&&&&&&&&&&&&&&&&break
&&&&&&&&&&&&}
&&&&&&&&&&&&video = SDL_CreateRGBSurface(SDL_SWSURFACE, 0
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Rmask, Gmask, Bmask, 0
&&&&&&&&&&&&if
&( video == NULL
&&&&&&&&&&&&&&&&SDL_OutOfMemory();
&&&&&&&&&&&&&&&&return
&&&&&&&&&&&&}
看作者的注释:
&If we are setting a GL mode, use GDI, not DirectX (yuck)
啥都明白了,原来即使是使用DirectX的video driver,SDL会在SetVideoMode的时候判断是否是使用OpenGL,是的话还是改用了GDI。
然后,WIN_GL_SetupWindow函数中,完成了在Windows下使用OpenGL需要设定的内容。具体的内容可以参考《
既然使用DirectX版本video driver的SDL最后其实也是使用GDI版本的surface,这里回头来看看GDI版本创建surface的步骤。
在GDI版本的video driver实际调用的是DIB_SetVideoMode函数来设定VideMode。
&Recalculate the bitmasks if necessary
&( bpp == current-&format-&BitsPerPixel ) {
&&&&&&&&video =
&&&&} else
&&&&&&&&switch
&&&&&&&&&&&&case
&&&&&&&&&&&&case
&&&&&&&&&&&&&&&&if
&( DIB_SussScreenDepth() == 15
&&&&&&&&&&&&&&&&&&&&/*
&&&&&&&&&&&&&&&&&&&&Rmask = 0x00007c00
&&&&&&&&&&&&&&&&&&&&Gmask = 0x
&&&&&&&&&&&&&&&&&&&&Bmask = 0x0000001f
&&&&&&&&&&&&&&&&} else
&&&&&&&&&&&&&&&&&&&&/*
&&&&&&&&&&&&&&&&&&&&Rmask = 0x
&&&&&&&&&&&&&&&&&&&&Gmask = 0x
&&&&&&&&&&&&&&&&&&&&Bmask = 0x0000001f
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&break
&&&&&&&&&&&&case
&&&&&&&&&&&&case
&&&&&&&&&&&&&&&&/*
&GDI defined as 8-8-8
&&&&&&&&&&&&&&&&Rmask = 0x00ff0000
&&&&&&&&&&&&&&&&Gmask = 0x0000ff00
&&&&&&&&&&&&&&&&Bmask = 0x000000ff
&&&&&&&&&&&&&&&&break
&&&&&&&&&&&&default
&&&&&&&&&&&&&&&&Rmask = 0x
&&&&&&&&&&&&&&&&Gmask = 0x
&&&&&&&&&&&&&&&&Bmask = 0x
&&&&&&&&&&&&&&&&break
&&&&&&&&video = SDL_CreateRGBSurface(SDL_SWSURFACE,
&&&&&&&&&&&&&&&&&&&&0
, bpp, Rmask, Gmask, Bmask, 0
&&&&&&&&if
&( video == NULL
&&&&&&&&&&&&SDL_OutOfMemory();
&&&&&&&&&&&&return
其实与DX5_SetVideoMode中创建Surface的代码一模一样,DX5_SetVideoMode函数中所谓的使用GDI的surface其实指的就是拷贝一份GDI创建surface的代码过去吧。。。。。接下来,同样的调用WIN_GL_SetupWindow完成Windows下设置OpenGL使用的必要操作。
看完相关源代码后,发现一切还是比较简单。
SDL GDI video driver
&&& 看完了SDL+OpenGL,这里了解一下SDL在使用GDI video driver时,自己附带的渲染功能。至于DirectX部分我就不看了,毕竟我对DirectX了解的不算太多,而且SDL用的DirectX版本实在太老了,但是,其实应该也不难懂,使用DDraw的方法其实和SDL的surface差不多。
SDL_LoadBMP其实是这样定义的一个宏:
#define SDL_LoadBMP(file)&& &SDL_LoadBMP_RW(SDL_RWFromFile(file, &rb&), 1)
SDL用SDL_Surface * SDL_LoadBMP_RW (SDL_RWops *src, int freesrc)这个函数来完成自己的从二进制数据中对BMP的解析,没有使用Windows提供的API(为了不同平台使用一套代码),加上BMP图形的数据解析起来还是比较简单的。
&SDL_Surface *screen = SDL_SetVideoMode(640 , 480 , 16 , SDL_DOUBLEBUF);
的代码创建surface的时候,(即不是使用OpenGL的时候)
在SetVideoMode的时候,SDL用以下代码来完成offscreen buffer:(这也是我第一次了解怎么使用Windows API来创建offscreen buffer)
&&&&&&&&/*
&Create the offscreen bitmap buffer
&&&&&&&&hdc = GetDC(SDL_Window);
&&&&&&&&screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS,
&&&&&&&&&&&&&&&&&&&&(void
&**)(&video-&pixels), NULL
&&&&&&&&ReleaseDC(SDL_Window, hdc);
&&&&&&&&SDL_free(binfo);
&&&&&&&&if
&( screen_bmp == NULL
&&&&&&&&&&&&if
&( video != current ) {
&&&&&&&&&&&&&&&&SDL_FreeSurface(video);
&&&&&&&&&&&&}
&&&&&&&&&&&&SDL_SetError(&Couldn't create DIB section&
&&&&&&&&&&&&return
最主要的API自然是CreateDIBSection,我查了下MSDN:
CreateDIBSection Function
The CreateDIBSection
function creates a DIB that applications can write to directly. The function gives you a pointer to the location of the bitmap bit values. You can supply a handle to a file-mapping object that the function will use to create the bitmap, or you can let the system allocate the memory for the bitmap.
按API的意思,其实这也不是原生用于offscreen buffer的,仅仅是一个可以直接写bitmap的内存。
在最后flip的时候,下面这段函数很关键:
&DIB_NormalUpdate(_THIS, int
&numrects, SDL_Rect *rects)
&&&&HDC hdc,
&&&&hdc = GetDC(SDL_Window);
&( screen_pal ) {
&&&&&&&&SelectPalette(hdc, screen_pal, FALSE);
&&&&mdc = CreateCompatibleDC(hdc);
&&&&SelectObject(mdc, screen_bmp);
&&&&&&&&BitBlt(hdc, rects[i].x, rects[i].y, rects[i].w, rects[i].h,
&&&&&&&&&&&&&&&&&&&&mdc, rects[i].x, rects[i].y, SRCCOPY);
&&&&DeleteDC(mdc);
&&&&ReleaseDC(SDL_Window, hdc);
在这里,使用了
&&& mdc = CreateCompatibleDC(hdc);
&&&&SelectObject(mdc, screen_bmp);
选择offscreen buffer到新创建的mdc中,然后从新创建的mdc向当前的hdc进行BitBlt,完成flip操作。当然,个人感觉,这种GDI模拟offscreen buffer的操作,在flip的时候还需要进行BitBlt,即使在两个dc间进行BitBlt比从内存到dc的快,但是效率上还是与OpenGL/D3D那种直接支持offscrren buffer的不在一个数量级,那可是直接切换显示不同区域的显存数据而已。
SDL源码大概浏览了一遍,没有细看,总的来说,看源码还是挺有帮助的,对于开源软件来说,文档也不能完全的详细说明每一个API的使用,但是对于开源软件,源码就是最好的文档。就此结束SDL的源码阅读过程,下一步,也许是略看Orx源码的时候了。。。。。。。。。。。。。。。。。。。。。。
基本上,对于游戏来讲,OpenGL的渲染部分其实并没有太大价值,虽然其接口的确非常简单,(也许不是游戏可以考虑使用一下)但是,作为一个跨平台的库,SDL还是有其独特的价值,SDL提供了一个跨平台的窗口管理模块,事件系统,多线程模块,声音模块,并且能够让你很方便的使用OpenGL渲染与其配置,基本上可以看做是一个非常强大并且完整的OpenGL使用环境。就像glut/free glut曾经想要做到的那样,只不过SDL比其走的更远而已。类似的库还有
,完成的其实也不错。对于只想好好的关心渲染部分,对其他跨平台的脏活累活不感兴趣的,SDL算是不错的选择。
原创文章作者保留版权 转载请注明原作者 并给出链接
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1813981次
积分:22488
积分:22488
排名:第100名
原创:428篇
转载:22篇
评论:2779条
公司一直在招聘Android应用开发, 有兴趣的见
此博客将为的编程相关内容的镜像站, 除了编程以外的内容这里就不发了, 毕竟是CSDN嘛.
(1)(1)(1)(1)(2)(2)(6)(1)(1)(2)(1)(5)(1)(2)(2)(5)(1)(1)(4)(5)(7)(5)(9)(28)(9)(4)(13)(4)(9)(11)(14)(18)(9)(18)(6)(25)(13)(6)(15)(16)(8)(16)(22)(11)(4)(2)(9)(2)(10)(7)(1)(4)(4)(3)(7)(5)(7)(16)(9)(27)5.17mmol/L(200mg/dl)怎么读_百度知道
5.17mmol/L(200mg/dl)怎么读
  读作:5.17毫摩尔每升(200毫克每分升)  很高兴可以帮助您,有问题可以再追问我哦!满意请采纳谢谢啦~
百度心情驿站
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁诊断学提纲_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
24页免费11页免费7页免费26页免费28页免费 9页免费11页免费62页免费5页免费
喜欢此文档的还喜欢3页免费9页1下载券2页1下载券81页免费2页免费
诊断学提纲|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢健康评估-课程课件-2发绀_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者贡献于
评价文档:
159页免费13页免费21页免费109页免费115页免费 107页免费77页免费23页免费58页免费20页免费
喜欢此文档的还喜欢159页免费23页免费12页免费12页免费115页免费
健康评估-课程课件-2发绀|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:789.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢}

我要回帖

更多关于 轻度阳痿怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信