【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈

转自:http://blog.csdn.net/poem_qianmo/article/details/7522960


本系列文章由zhmxy555(毛星云)编写,转载请注明出处。

http://blog.csdn.net/zhmxy555/article/details/7522960

作者:毛星云    邮箱: happylifemxy@qq.com    


------------------------------------------------------------------------------------------------------------------------------

浅墨历时一年为游戏编程爱好者锻造的著作《逐梦旅程:Windows游戏编程之从零开始》

如果你喜欢浅墨写的【Visual C++】游戏开发系列博客文章,那么你一定会爱上这本书。

这是浅墨专门为热爱游戏编程的朋友们写的入门级游戏编程宝典。



------------------------------------------------------------------------------------------------------------------------------



作为游戏开发界老生常谈的话题,浅墨认为有必要写这样一篇文章来专门分析一下两者的优劣。这节就是给大家

DirectXOpenGL的一个整体的认知,也以至于扩大我们的【C++游戏开发】专栏的适用范围到广义的游戏开发,而不仅

Windows游戏开发。毕竟适用于iOS和Android以及WindowsPhone的各种游戏引擎基本上都是采用C++编写的,

望有幸将我们的C++游戏开发的范畴扩展至iOS、Android以及WindowsPhone平台,为这些热门的移动平台编写出我们自

开发的游戏引擎,以促进移动游戏开发的进一步发展。




一、体系认知



目前,我们可接触到的图形API可分为OpenGL和DirectX两大体系,前者是一项开放性的标准,主攻专业图形应用和3D游戏,由"OpenGL架构委员会"掌控,其成员包括业内各大厂商,目前主要推动标准发展的实际领导者是3Dlabs。DirectX则是微软制定的API标准,除了图形API功能外,它还包含音频API等功能,只不过其图形部分升级最快、也最为人所知。DirectX针对的主要是娱乐应用,目前流行的DirectX 9 API功能极为强劲,目前市面上的大部分新3D游戏都基于DirectX 9,而图形芯片制造商更是将它作为标准、竞相提供对DirectX 9的支持,是否支持DirectX 9也成为两代显卡的分水岭。


虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。


2009年10月22日,微软公司正式发布Windows 7,DirectX 11集成在Windows 7 中同步登场,但其实DirectX 11只是DirectX 10的大幅度加强版,而不是9.0C和10.0/10.1的彻底革新。


国内这方面的教材革新比较缓慢,由于DirectX 11与windows 7集成,在2009年同时推出,而导致基于DirectX 11的中文教材与文献非常稀少。


而为了让大家掌握到国际最新的技术,本系列文章后续内容会对目前最新的DirectX 11进行深入讲解,希望有兴趣了解最新技术的朋友们持续关注。


下面我们分别简单概述一下DirectX与OpenGL。




二、 微软的宠儿——DirectX




DirectX是微软公司提出的一种应用程序接口(API),由C++编写,它可让以Windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。


DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。


这样说也许大家还是有些不太明白,那我们就从字面意义上来理解吧。Direct英文含义是“直接”的意思,表示直接建立在硬件之上,而后边的X则表示“未知的”,具体代表相关的组件,比如3D、Sound、Music、Input、Play、Show。我们将DirectX中代表泛指的“X”换做一个特指,比如说我们换做”3D”,那么DirectX摇身一变就成了它的一个组件Direct3D


微软比较明智,为众厂家推出了一个共同的应用程序接口——DirectX,并赋予它“硬件设备无关性”的特性。只要这个游戏是依照DirectX来开发的,不管你是什么显卡、声卡、统统都能玩,而且还能发挥更佳的效果。当然,前提是你的显卡、声卡的驱动程序也必须支持DirectX。


这样就很容易理解了,总结起来就是,DirectX的出现就是为各种品牌的硬件提供了一个共同的硬件驱动标准。




三、不甘做备胎——OpenGL



OpenGL定位为专业图形处理,英文全称是"Open Graphics Library",意为"开放的图形程序接口"。OpenGL的历史可以追溯到上个世纪90年代初,标准诞生之后它一直占据主导地位。微软的DirectX出现的时间比OpenGL来得晚,但就在最近数十年,OpenGL因发展迟缓而被DirectX反超。


事情回溯到1999年,OpenGL发生了一次比较失败的变革,导致了之后的危机:


OpenGL的缔造者SGI(Silicon Graphics硅图)决定与微软联手开发下一代图形接口--Ferihant。Ferihant应用于Windows系统中,作为OpenGL和DirectX的取代者。为此,Ferihant将包含DirectX与OpenGL各自的优点,并加入场景贴图之类的高级功能。由于有了Ferihant,SGI停止了原先的Windows版OpenGL开发计划,外界对此表示赞赏。然而Ferihant计划没进行多久,双方的合作就出现裂痕,微软不积极合作,光想把SGI的图形技术并入DirectX的做法令SGI非常不满,SGI随后宣布中止合作并撤回所有的开发人员,Ferihant遂告夭折。在这之后,OpenGL和DirectX似乎互不相干,继续在PC平台上发展,但状况对比鲜明:DirectX从此突飞猛进,而OpenGL却长期原地徘徊。其间,DirectX 8 API更是正式成为娱乐显卡的标准,id公司所形容的"支离破碎的DirectX"早已非吴下阿蒙,大量的3D游戏转向了DirectX体系。


尽管如此,OpenGL目前仍然是高端图形API的代名词, Khronos Group在2009年3月又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新,它以强劲的功能特性为业界瞩目,而显卡制造商对OpenGL API的重视程度并未缩减。


Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。


在可预见的将来,OpenGL仍将是DirectX的宿敌。




四、DirectX与OpenGL的博弈



首先,做一个概念性的总结,DirectX是一个功能强大的统一的API接口,而OpenGL是一个高级图形库。



<1>市场占有率,DirectX的压倒性优势


经常玩电脑游戏的各位都会有这样的一个体会,我们安装一款游戏后,经常会报错缺少某dll而无法进入,但只要我们更新到最新的DirectX运行环境,基本上就可以正常进行游戏了,这是因为市面上绝大多数游戏都是基于DirectX的。对游戏开发了解有限的玩家基本上都会知道DirectX是他们玩游戏必须安装的,但知道OpenGL的却寥寥无几。


毋庸置疑,DirectX占据着游戏市场绝对的优势,据估计目前市面上几乎所有的电脑游戏都是基于DirectX而开发的。《百度今日网游排行榜》上的前五十名,无一例外,全部拜倒在DirectX的石榴裙下。这里我们列举出前十名,他们依次是《地下城与勇士》,《穿越火线》 ,《英雄联盟》,《魔兽世界》,《QQ飞车》,《QQ炫舞》,《梦幻西游》《龙之谷》,《倩女幽魂》,《第九大陆》 。(2012年4月29号榜单)


且一款显卡,想要立足于PC市场,首先要做的就是支持DirectX,而支持OpenGL,只是备胎而已。


使用DirectX是因为API的选择是基于游戏开发的积极反馈,这一切都发生在2005年:


如果一个API越流行,那就有越多人用,然后它就会更流行,如此循环。。。这种网络效应带来的结果就是:更流行的API获得更好的硬件厂商支持,图形程序员随后更意于选择他们已经熟知的API。


DirectX的胜出得益于微软的两次十分尖锐的战役,围绕XBox360和windows vista,当然DirectX的胜出原因也包括着围绕着OpenGL的开源项目的固步自封,以及微软围绕DirectX进行的夸大宣传攻势。



<2>OpenGL的现状,一半明媚一半忧伤



虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。


OpenGL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。



<3>跨平台,OpenGL优势之所在



关于跨平台,这是OpenGL对比DirectX绝对的优势。


DirectX仅能用于Windows系列平台,包括Windows Phone/Windows Mobile/Windows CE系列以及XBOX/XBOX360。


而OpenGL除了可以支持DirectX所适用的平台外,可以支持Unix、Linux、MacOS、Android、iOS等。


值得一提的是,由于最近几年移动开发市场的迅猛发展,Android和iOS需要一款的专业的图形库,跨平台的OpenGL无疑是最好的选择。



<4>全能性,DirectX优点明显


DirectX 包含图形, 声音, 输入, 网络等模块,包含开发一款游戏所需的全部工具,全能性明显。

OpenGL 只是图形函数库。只能用于图形处理,用于开发游戏时,输入,声音,网络等方面还需配合其他函数库。比如声音方面我们就经常配合采用OpenAL。




五、结语


介绍得这么多了,大家应该有一个整体的认知了,这里我们做一个总结。

如果你想进行PC,Windows Phone以及XBOX/XBOX360相关的开发(不仅仅局限于游戏开发),选择DirectX。

如果你想进行Android、iOS、MacOS 、Linux等平台的游戏开发或相关专业图形开发,或者喜欢跨平台的特性,选择OpenGL。





本篇文章到这里就结束了。这节就是给大家对DirectX和OpenGL的一个整体的认知,扫清图形库选择方面的障碍,希望能对有这方面疑惑的朋友有所帮助。

这篇文章涉及到不同技术之间的比较了,浅墨不希望有不和谐的事情发生,也许是一家之言,有些地方或许不太中肯,欢迎有

不同见解的朋友与我进行讨论与互动。



感谢一直支持【Visual C++】游戏开发笔记系列专栏的朋友们,也请大家继续关注我的专栏,我一空就会把自己的经验写出来与大家分享。

精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。

大家看过后觉得值得一看的话,可以顶一下这篇文章,你们的支持是我继续写下去的动力~

如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。

最后,谢谢各位一直的支持~~~



——————————浅墨于2012年4月29日


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者对游戏的说明: 首先,您应当以一种批判的眼光来看待本程序。这个游戏是我制作 的第一部RPG游戏,无任何经验可谈,完全按照自己对游戏的理解进 行设计的。当我参照了《圣剑英雄2》的源码之后,才体会到专业游 戏引擎的博大精深。 该程序的内核大约有2000余行,能够处理人物的行走、对话、战斗, 等等。由于该程序的结构并不适于这种规模的程序,故不推荐您详 细研究该程序。所附地图编辑器的源程序我已经添加了详细的注释, 其程序结构也比较合理,可以作为初学VC的例子。 该程序在VC的程序向导所生成的SDI框架的基础上修改而成。它没有 使用任何关于VC底层的东西。程序的绝大部分都是在CgameView类中 制作的,只有修改窗口特征的一段代码在CMainFrm类中。其他的类 统统没有用到。另外添加的一个类是CEnemy类。 整个游戏的故事情节分成8段,分别由Para1.h ~ Para8.h八个文件 实现。由于程序仅仅能够被动的处理各种各样的消息,所以情节的 实现也只能根据系统的一些参数来判断当前应当做什么。在程序中 使用了冗长的if……else if……结构来实现这种判断。 当然,在我的记录本上,详细的记录了每个事件的判断条件。这种 笨拙的设计当然是不可取的。成都金点所作《圣剑英雄II》采用了 剧本解读的方式,这才是正统的做法。但这也需要更多的编程经验 和熟练的code功夫。 下面列举的是程序编制过程中总结出来的经验和教训。 第一,对话方式应该采用《圣剑英雄II》的剧本方式。 现在的方式把一个段落中所有的对话都混在一个文件中,然后给每 句话一个号码相对应。这样做虽然降低了引擎的难度,却导致剧情的 编写极其繁琐。 第二,运动和显示应当完全分开。 现在的程序中,运动和显示是完全同步的。即:在定时器中调用所有 敌人的运动函数,然后将主角的动画向前推一帧,接着绘制地图,调 用所有敌人的显示函数、重绘主角。这样的好处是不会掉帧,但带来 的问题是,如果要提高敌人的运动速度,那么帧数也跟着上去了。所 以当DEMO版反馈说速度太慢的时候,我修改起来非常困难。而这个问 题到最后也仅仅是将4步一格该成了2步一格。 第三,VC中数组存在上限。如果用“int aaa[1000000000]”定义一个 数组,编译器肯定不会给分配那么大的内存空间。而在这个程序中, 地图矩阵、NPC矩阵都超过了VC中数组的上限。但这一点知道的太晚了。 在1.0版本中已经发现地图最右端缺少了几行,但不知道是什么原因 造成的。(地图编辑器中未出现此问题,因为地图编辑器是用“序列 化”的方式存盘读盘的。)解决这个问题的方法是用“new”来分配 内存空间。 第四,由于不知道应该如何使用“new”和“delete”,几乎所有的DC 都使用了全局变量。这是完全没有必要的。程序运行期大约会耗用20 多M的内存空间,相当于一个大型游戏所使用的内存空间了。 另外,在游戏的剧情、美工方面也有许多问题,总之一个词“业余”。 我就不总结了。下一部作品,我将争取在程序上有一个质的飞跃。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值