收藏 分享(赏)

基于sdl&opengl的跨平台三维游戏中的关键技术研究.doc

上传人:cjc2202537 文档编号:202046 上传时间:2018-03-23 格式:DOC 页数:15 大小:51KB
下载 相关 举报
基于sdl&opengl的跨平台三维游戏中的关键技术研究.doc_第1页
第1页 / 共15页
基于sdl&opengl的跨平台三维游戏中的关键技术研究.doc_第2页
第2页 / 共15页
基于sdl&opengl的跨平台三维游戏中的关键技术研究.doc_第3页
第3页 / 共15页
基于sdl&opengl的跨平台三维游戏中的关键技术研究.doc_第4页
第4页 / 共15页
基于sdl&opengl的跨平台三维游戏中的关键技术研究.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、基于 SDLOpenGL 的跨平台三维游戏中的关键技术研究第 14 卷第 2 期2006 年 4 月电脑与信息技术C0MPUrERANDINF0RMAT10NTECHN0L0GYVo1.14NO2Apr.2006文章编号:10051228(2006)02 001604基于 SDLOpenGL 的跨平郑光勇,李台三维口一;It:肯立,游戏中的关键技术研究黄海明 3(1.衡阳师范学院,湖南衡阳 421008;2.湖南大学,湖南长沙 410000;3.中国科学院自动化所,北京 100000)摘要:三维游戏正处在蓬勃发展的时期,跨平台三维游戏开发技术中涉及的优化技术仍然是值得关注和难于掌握的.文章从跨

2、平台技术开始,以一款具体的三维游戏设计为例,分析了三维游戏中的各种功能实现和优化技术,包括纹理技术,列表技术,高级字体技术,IBR 技术 ,混合技术以及绘制顺序的优化策略等,并通过运用这些优化技术来得到较好的游戏结果.关键词:三维游戏;SDLOpenGL;跨平台;优化中图分类号:TP3l1.52 文献标识码:AResearchonthekeytechnologyinthetrans-platformthree-dimensionalgamesbasedonSDLopenGLZHENGGuang-yong,LIKeng-li2,HUANGHaimin(1.HengyangNormalUniver

3、sity,Hengyang,Hunan421008,China;2.HunanUniversity,Changsha,Hunan410000,China;3.TheInstituteofAutomationofChinaScienceAcademy,Beijing100000,China)Abstract:Thethreedimensionalgamesareintheirflourishingstage,andthedevelopmenttechnology,especiallytheoptimizingtechnology,inthetransplatformthreedimensiona

4、lgamesremainsworthyofbeingexploredanddifficulttomaster.Proceedingfromthetransplatformtechnologyandtakingthedesignofacertainthreedimensionalgameasanexample,thisarticleanalyzesthefunctionrealizationandoptimizationtechnologyinthethreedimensionalgames,includingthegraintechnology,thetabulatingtechnology,

5、advancedtypefacetechnology,IBRtechnology,theblendingtechnologyandtheoptimizingtacticsofthedrawingorder,anddemonstratesthedesirablegameresultsachievedthroughtheapplicationoftheoptimizingtechnology.Keywords:three-dimensionalgames;SDLOpenGL;transplatform;optimization1 关于跨平台选择开发模式与开发库是重要的一个环节.SDL(Simple

6、DirectMediaLayer)作为免费的跨平台多媒体应用编程接口,已经被人们广泛用于开发二维游戏,其优秀的消息框架支持,文件支持和声音支持都使得它能与微软 DirectX 匹敌.OpenGL(OpenGraphicsLibrary)是一种独立的平台无关的三维图形开发库,在各种语言下进行主框架开发并结合应用 OpenGL 函数都可以开发出三维游戏.但是由于框架开发的平台相关性会导致游戏无法跨平台编译运行,因此我们一般采用收稿日期:20060222作者简介:郑光勇(1972 一),男,湖南蓝山人,讲师,硕士生,研究方向:数据挖掘,算法研究;黄海明(1973 一), 男, 博士,研究方向:软件开

7、发.第 2 期郑光勇等:基于 SDLOpenGL 的跨平台三维游戏中的关键技术研究glut+opengl 来生成从框架 31-维绘制的一整套系统.具体的说,我们在 VC 环境下经常采用的一种开发模式是先生成一个 console 工程再用 glut 函数生成所有的主界面框架,消息处理等,而绘制过程则利用 OpenGL 来实现.但是在对复杂框架的支持和对各种媒体支持方面,glut 显然不太合适.在 Linux 下可以采用FLTK 等框架平台技术来实现包括按钮在内的比较复杂的框架功能,但是需要专门的 Linux 开发环境,对于众多的 Window 环境下的 KDE 爱好者明显无法适从.而且 glut

8、 也无法兼顾对声音等媒体的支持,因此我们最终采用 SDL+OpenGL 的构架,生成了一个跨平台的三维扑克游戏.为了保证游戏的跨平台性,不能使用与Win32 紧密关联的一些类,而应该采用一些标准的 C+类来代替,例如 MFC 的 CArray 类可以用C+标准模板类库 STL 中的 Vector 来代替.同时避免使用与 WIN32 相关的函数和库,如 wgl*函数,aux 库函数以及其他一些非标准函数等.基于 SDL+OpenGL 的三维游戏开发中需要在游戏初始化时进行正确的配置,即进行合理的游戏初始化.在用 SDLGL_SetAttribute 进行了正确属性预置后,还要用 SDL_SetV

9、ideoMode 将显示模式设定为 OpenGL 方式.2 游戏的结构与状态一款三维游戏根据其不同的类型可以采用不同的核心数据结构,在具有复杂大场景的第一人称漫游类游戏中,需要采用 BSP 或 Port 这样的技术来组织整个场景中的所有虚拟物体,从而达到方便地进行可见性判断,如遮挡剔除和碰撞检测之类的高级功能.我们所设计的这款游戏针对普通休闲娱乐,视点可变换范围不大,基本上不需要复杂的场景组织结构.我们只构造了一个虚拟场景类 CVinualEnvir0nment 的对象 m_VScene,该对象包含了所有来自于模型文件的信息,即所有模型物体的几何,法线,纹理映射等.这些信息在m_VScene

10、中被组织成一个个虚拟物体类 CVirtualObject 的对象 mVObject,每个对象都有对应的ID 号 .显然,现在只需对 mVscene 中的所有物体进行轮流绘制就可以将所有物体绘制出来.但是由于游戏中存在很多分支情况,例如达到分值需要对应某种特效,进行某种操作需要显示某些新物件,在某些情况下按键才起作用,某时游戏需要完全重置或部分重置,游戏在满足某种条件时需要进入子游戏等.如此多的状况需要合理而清晰的划分游戏状态并正确控制.实际中我们为整个游戏划分了 13 个游戏状态,并且规定了哪个状态需要绘制哪些物体以及如何绘制这些物体.显然,单纯的对 m_Vscene 进行轮流绘制是不行的 ,

11、我们按照面向对象思想,以方便游戏状态控制为原则,划分了若干个区域类,如渔区类,牌区类,背景区类,奖级表区类,用户信息区类,键盘区类等.每个区类根据情况包含了许多小类,例如渔区类包括了鱼类对象 m_Fish,思维泡泡类对象 m_PaoPao等.当然每个对象都有一个 CVirtualObject 指针成员 m_VO 指向 m_Vscene 中对应的 m_VObject,这样当某状态需要绘制渔区对象 m_FishArea 时只要调用对应的 m_FishArea.Draw()就可以了.因为在 m_FishArea.Draw()内定义了 m_Fish.m_VODrawComplexNode()等.3 游

12、戏的功能设计与优化从程序设计的角度来说,游戏的实现还只是一小部分,游戏中最重要的两个因素就是效果和速度.为了提高游戏效果和游戏速度,我们进行了如下的一些高级功能设计和优化.3.1 纹理技术在纹理技术上采用了 jPg,png 等文件支持,加载优化和 mipmap.对多种纹理格式的支持主要是为了减少纹理文件的大小,这里结合 SDLimage 的文件导人并进行合理的 0【通道判断来生成纹理对象.加载的优化着重于两个方面:避免同一纹理文件的重复加载和同一纹理对象的反复生成.同一纹理文件的重复加载明显要加大游戏的载人时间,特别是频繁的磁盘操作更令人无法容忍.同样,对于同一个纹理图片没有必要生成若干个纹理

13、对象,即对于不同物体间共有的纹理图片,我们可以只生成一个纹理对象,其他同纹理图片的物体只要绑定这个纹理对象就可以了.因此本游戏中设定了一个已载人纹理文件的名称表,在模型载人的过程中遇到某纹理文件第电脑与信息技术第 14 卷一次作为物体的纹理被加载时,生成纹理对象,并将其名称写入表中,后面遇到某物体也需要这个纹理时只需为其设定对应的纹理对象名就可以了.Mipmap 技术是现在广泛使用的纹理技术,可以自动生成一系列大小的纹理,可根据物体的远近自动选用不同大小的纹理,从而提高了渲染速度,避免了光栅化时由于大纹理图作用于很小像素区而出现的不真实现象.3.2 显示列表技术显示列表技术也是广泛使用的技术,

14、在我们的游戏中,对牌,桌面等每一个物体都会生成各自的显示列表,用 MakeComplexNodeList()来生成显示列表,再用 DrawComplexNode()进行绘制.这里特别要注意的是,不能将耗时的运算或操作放在显示列表内,因为显示列表会被频繁调用,导致系统速度急剧下降.在我们的实验中将生成物体纹理对象的代码放在列表内,导致系统速度下降了20fvs.在绘制过程中系统普遍采用了图元类型优化的方法来减少顶点数据的传输量,例如将GL-JRINGLES 改为 GL-TRINGLE-STRIP,这样就可以在将顶点数据传送到显存的过程中最大程度的避免重复数据的传输量.利用显示列表还可以实现模型重用

15、,即对于不同物体可以只用一个模型来代替,从而达到减少模型数量,减少显示列表切换频率,提高系统速度的效果.在游戏中我们对 25 张牌采用了这种技术,当牌扑在牌桌上时其表现是一样的,所以我们用来一张牌模型的显示列表加上必要的平移就可以绘出所有的 25 张牌,从而将系统速度提高lfvs.对于子游戏中的多个支架也可以只用一个架子的显示列表加上必要的平移,从而减少了几何顶点数据重复流向显存.3.3 高级字体技术由于游戏中要用到大量的中英文字,一种技术就是采用为每个文字预先做好一个图片的方法,在需要显示该文字的地方进行相应的纹理贴图映射.但是这种方法会导致大量的图片制作工作量,且不利于对字体风格进行修改.

16、本游戏利用SDL 对 ttf 字体的支持,在 SDL 的上层封装了一个CZiMu 类,可以实现运用指定 tLf 字体,字号,在指定的屏幕位置绘制指定的中英文字.其数据结构如下:ClaSSCZiMupublic:CFontm_GameFont;/字体号TexlnfoFixTex;/固定的字幕信息TexlnfoDynFixTex【256;/用来存放预定义的256 个字,供动态字幕调用voidDrawZiMu(intWidth,intHeight,intx,intY,charcurrentmessage,intDrawType);/绘制CZiMu();-CZiMu();protected:voidd

17、rawFrameSet2D(intwidth,intHeight);voiddrawFrameRestore3D();intConvertToPowerOtTwo(intinput);TexlnfoGenFixWordTex(charmymessage);/生成静态不变的字幕信息TexlnfoGenDynWordTex(charmymessage);/生成动态字幕信息voiddrawFontLetter(floatX,floatY,intlet?ter);/画一个字符floatdrawFontWord(floatX,floatY,char*word);/画一行字符);最后用方法 DrawZiM

18、u()进行绘制 .显然,在绘制某单个文字之前,必须生成该文字的图片,这个纹理图片生成的过程是很耗时的,无法达到游戏所需的实时性要求.因此在实际系统中,我们力求预先生成所有的在游戏中需要的相应字体的字图片,这样就产生大量的字图片纹理,当显示某字时就加载绑定对应的纹理对象.在大量图片纹理号中如何找到对应的纹理号是一个问题,显然可以标识各个字间不同的就是字码,可以通过在结构对象(即字码/纹理号二元组)链表中采用逐个匹配的方法,这样的时间效率为 O(n),其中 n 为预先生成的字图片纹理总数量.为了提高搜索速度,我们采用 hash 表的方法,通过构造生成函数来将字码转化为对应的图片纹理号,当不同字所产

19、生的纹理对象号一致时才进行局部搜索,假设平均局部深度为 k,则时间效率为O(k),显然 kn,所以基于 hash 的方法可以得到更高的效率.但是预先生成所有的在游戏中需要的相应字体的字图片会占用大量的内存空间.为此我们将游戏中每个字不采用预先生成字图片的方法,而第 2 期郑光勇等:基于 SDLOpenGL 的跨平台三维游戏中的关键技术研究?19?是当要绘制该字时在 hash 表中进行查询,如果发现所对应的纹理号为无效,则即时生成该字图片并生成该纹理号对应的纹理对象,这样可以避免那些根据游戏流程不会出现的字所对应的纹理对象的生成.3.4 基于 image 的渲染技术基于 image 的渲染技术,

20、即 ImageBasedRender(简称 IBR),分为模型用和场景用两类 .模型用的 IBR 主要是利用 image 作为纹理来简化游戏中模型的复杂程度,在大大简化美工工作量的同时也提高了场景渲染的速度,并且从效果上不会让人对模型几何产生太多的怀疑.另一方面是利用 image 贴图,特别是基于照片的纹理,可以极大的节省美工在物体材质设置中的麻烦,同时也比单纯的材质设置更能达到真实效果.由于灯光会影响材质的效果,因此一般将设置了材质的物体在灯光下渲染生成 image,做成纹理应用于实际游戏场景中可以达到较高的真实感.场景用的 IBR 是用于整个场景的.因为在很多情况下视点是不会变化的,这样,

21、场景中所有没有运动的物体在每帧中的渲染结果都是一样的,因此我们考虑以首次对场景中静态物体进行渲染所生成的图像为基础,用以生成对应的纹理对象,贴在由 viewport 确定的矩形框内.矩形框的距离取场景中离视点最远的点到视点的距离,矩形框的大小以完全覆盖视域为原则.这就使得对场景的渲染简化为对该矩形框,某些需要重绘的静态物体和场景中所有运动物体的渲染,需要重绘的静态物体是指那些与运动物体间有遮挡关系且遮挡了动态物体的静态物体,在本游戏中不存在对动态物体有遮挡的静态物体.3.5 混合技术合理的混合 blend 可以得到各种效果,包括用透明纹理来大大简化几何造型,例如场景中的牌,鱼等对象就是用透明纹理实现的,混合还可以生成星星闪烁等效果.但是,在渲染不同物体时要采用合理的绘制状态,合理的状态设置可以提高渲染速度.对于无透明效果的物体在渲染时没有必要打开 blend,因为 blend 打开后,由于系统会对没有 alpha 通道的纹理自动设置为完全不透明 alpha 值来参加计

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报