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

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

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

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

作者:毛星云    邮箱: happylifemxy@qq.com    欢迎邮件交流编程心得




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

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日



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写在前面-2015.11.30

本人90后&#xff0c;工作不是很久&#xff0c;大学期间主修软件工程&#xff0c;也在课外班学习java开发&#xff0c;后机缘巧合学习测试。截止2015年末&#xff0c;功测1年经验&#xff0c;&#xff08;纯手工&#xff09;自动化没有实战经验仅限于了解。目前性能测试一年。主…

linux c 获取时间戳 打印时间戳

以下是项目开发中常用到的时间戳接口&#xff0c;可以直接用。 一、相关接口 二、代码实现 char* lgw_get_now_time(void) {time_t timep;time(&timep);return asctime(localtime(&timep)); } int lgw_get_now_tick(void) {time_t timep;time(&timep);return ti…

[react] react的性能优化在哪个生命周期?它优化的原理是什么?

[react] react的性能优化在哪个生命周期&#xff1f;它优化的原理是什么&#xff1f; shouldComponentUpdate 减少不必要的重新渲染 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

让source insight更好的支持中文

From: http://blog.csdn.net/aylixuan/article/details/6066126 1.记事本录入以下文字&#xff1a; /* * 代替SourceInsight原有的Backspace功能&#xff08;希望如此&#xff09; * 增加了对双字节汉字的支持&#xff0c;在删除汉字的时候也能同时删除汉字的高字节而缓解…

阿里云linux主机安装qt报错:缺少libxkbcommon-x11.so.0

ubuntu云主机安装xfce桌面后&#xff0c;下载qt5.12.10&#xff0c;开发桌面应用&#xff0c;安装qt时报错缺少libxkbcommon-x11.so.0。 由于xfce是轻量级桌面不带libxkbcommon-x11.so.0&#xff0c;而qt5.12.10默认系统已经自带&#xff0c;所以&#xff0c;报错。此时更新一下…

[react] 你知道的react性能优化有哪些方法?

[react] 你知道的react性能优化有哪些方法&#xff1f; shouldComponentUpdate PureComponent &#xff1a;Class ComponentReact.Memo &#xff1a;Function ComponentuseCallback &#xff1a;Memoized FunctionuseMemo &#xff1a;Memozied Value个人简介 我是歌谣&#…

【转】XP/2000无法使用“缩略图查看”、右键无“设置桌面背景”选项问题详解...

许多朋友在XP或2000系统下查看图片时&#xff0c;经常碰到以下几个问题&#xff1a; 1. 当我查看文件夹里面的图片&#xff0c;以缩略图方式查看时&#xff0c;却发现系统不能显示图片内容了&#xff0c;只是出来一个简单的图片图标&#xff08;就和我们以图标或平铺显示的…

PHP的curl实现get,post 和 cookie(几个实例)

类似于dreamhost这类主机服务商&#xff0c;是显示fopen 的使用 的。使用php的curl可以实现支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传&#xff0c;kerberos、基于HTT格式的上传、代理、cookie、用户…

Qt treeWidget 查找指定字段内容的条目并跳转到该条目

遍历Qt treeWidget&#xff0c;查找指定字段内容的条目&#xff0c;并跳转到该条目。 void MainWindow::on_pushButton_sidFind_clicked() {QString sid ui->lineEdit_sidFind->text();QTreeWidgetItemIterator it(ui->treeWidget_sqItem);while (*it) {if ((*it)-&…

[react] 什么是浅层渲染?

[react] 什么是浅层渲染&#xff1f; 当为 React 写单元测试时&#xff0c;浅层渲染(Shallow Renderer) 会变得十分有用。浅层渲染使你可以渲染 “单层深度” 的组件&#xff0c;并且对组件的 render 方法的返回值进行断言&#xff0c;不用担心子组件的行为&#xff0c;组件并…

document.all和document.layers

document.all是IE 4.0及以上版本的专有属性&#xff0c;是一个表示当前文档的所有对象的娄组&#xff0c;不仅包括页面上可见的实体对象&#xff0c;还包括一些不可见的对象&#xff0c;比如html注释等等。在document.all数组里面&#xff0c;元素不分层次&#xff0c;是按照其…

strip and linux lib compile

From: http://www.360doc.com/content/11/0808/17/7472348_138951246.shtml strip经常用来去除目标文件中的一些符号表、调试符号表信息&#xff0c;以减小程序的大小&#xff0c;在rpmbuild包的最后就用到。 其支持的选项如下&#xff1a; >strip -h 用法&#xff1a;str…

SpringMVC之控制器的单例和多例管理

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 在使用Spring3对控制器Controller进行bean管理时&#xff0c;如果要对控制器是否单例进行管理。 有两种方式配置多例模式&#xff1a; 1.springXML 2.注解本身的控制器类 [java] view plaincopyprin…

Python多个版本指定如何指定

1、指定python3 32bit 版本安装SciPy库 py -3-32 -m pip install SciPy 2、指定python2 64bit 版本安装SciPy库 py -2-64 -m pip install SciPy 3、进入指定版本根目录执行操作 D:\Tools\python37_32bit>python.exe -m pip list

[react] react16的reconciliation和commit分别是什么?

[react] react16的reconciliation和commit分别是什么&#xff1f; React 16 三个核心&#xff1a; Scheduler 调度器&#xff1a;决定什么时候调度 ReconcilerReconciler 协调器&#xff1a;进行 Fiber diff 及新的 Fiber 树的生成以及副作用记录Commit 将新的树应用到 DOM 中…

BZOJ 1997: [Hnoi2010]Planar( 2sat )

平面图中E ≤ V*2-6..一个圈上2个点的边可以是在外或者内, 经典的2sat问题..------------------------------------------------------------------------------------------#include<cstdio>#include<cstring>#include<algorithm>#include<stack>usin…

Qt6.2.1在线安装教程

1、Qt下载官网 Download Qt | Develop Desktop & Embedded Systems | Qt 2、下载后在线安装 安装时会要求登陆账号&#xff0c;这个可以去官网注册账号。 相关模块和版本按需选择。以下为我的项目开发需要安装的部分模块&#xff1a; 然后漫长等待安装结束即可。

Vxworks增加system call

Vxworks中增加system call的伪代码.比如用户层可以获取kernel中的time tick.#include <syscall.h>#include<syscallLib.h>unsignedshortgettimdsp(void);SYSCALL_RTN_TBL_ENTRYmsGetTbl[] {{(FUNCPTR) gettimdsp, 1,"gettimdsp", 0}};unsignedshortgetti…

[react] 使用react写一个todo应用,说说你的思路

[react] 使用react写一个todo应用&#xff0c;说说你的思路 拆分组件&#xff1a;应用 表单部分&#xff08;input button&#xff09;、列表部分&#xff08;checkbox ul>li delete button&#xff09;数据设计&#xff1a;表单的待输入字段 列表中的List数据&#x…