为什么游戏偏爱D3D

如今游戏领域已经是D3D的天下,但还是有人不断搬出10年前John Carmack的话批驳D3D,尽管Carmack后来多次声明D3D已经有了很大改观,以前的批评已经不再适用。如今公认的评价是D3D和OpenGL在功能、速度和易用性上基本等价。但这无法解释为什么游戏开发商倒向D3D。不少人说是因为游戏开发以前是用DirectDraw的,转到同一风格的D3D比较容易。但两者的相似处也太少了,无论如何从2D转到3D都是要从新学习一套新的体系。而且D3D的每个版本都不同,怎么说也比转到OpenGL的代价大。难道开发商都被微软Mind Control了?

这里我们必须先跳出技术的圈圈。对商业游戏开发来讲,利润是必须的,饿着肚子是没法谈技术和创新的。从众多偶像级开发商的倒闭就知道这个产业的竞争有多激烈。一个游戏最主要的两个卖点就是图像和娱乐性,而新的图像特效比较容易使游戏很快的脱颖而出,而娱乐性更多地影响游戏的寿命。众所周知,OpenGL在推出新特性上总是比D3D慢半拍,但这半拍足以导致游戏落后一年。熟悉OpenGL的人会说OpenGL是允许显卡厂商添加扩展的,同等功能的OpenGL扩展很快就会出现。但是,微软专制的D3D一更新,各种支持其标准的显卡就很快大量涌现;而最早面世的OpenGL扩展都是各个显卡芯片厂商自己定义的,不同的厂商的支持都不一样,然后厂商间协调,为专利问题讨价还价,最后达成多数厂商都能共同支持的EXT或ARB扩展,已经旷费很多时日了。

第二,与CAD等软件不同,游戏是面向大众消费者的。开发商需要游戏尽可能没有麻烦地在用户机器上运行,而普通消费者不知道也不关心D3D、OpenGL是什么东西。对游戏而言,没有3D硬件加速是不能接受的。D3D的游戏一般会带DirectX的安装包,对于不同版本的显卡驱动,D3D都能提供硬件加速的接口。而对OpenGL,相当比例的普通用户的系统上是没装OpenGL ICD Driver(即OpenGL的硬件加速驱动)的,其结果就是幻灯片式的逐帧显示。而且因为不少功能是后来显卡厂商更新驱动后加进去的,就是说,即使用户系统上装了OpenGL ICD Driver,也可能只是1.2、1.3等旧版的,需要下载安装最新版驱动才能使用新特性。估计有人会提GLSetup这个自动检测安装ICD的工具,但似乎这个项目几年前就停止了。从功能上,D3D是忠实的反映硬件能力,可以查询各项硬件指标,超出硬件能力的都是不支持的(但顶点处理可以选择使用软件模式);而OpenGL在硬件不能支持时会自动由软件模拟,这对CAD应用是很理想的,事实上我也很喜欢它这点,但这对游戏是致命的。由于OpenGL各版本的核心功能集合是强制支持的,而硬件未必支持,所以硬件不支持的部分或支持但超出硬件处理范围的部分是由软件模拟的。所以支持OpenGL 2.0的ICD并不意味者全部功能都是硬件加速的。想知道硬件能支持到什么程度,还是要用DXCapsViewer看一下。

第三,商业项目必须考虑成本和时效性。软件项目中,人力成本往往是最大的部分,而按时交工又是开发组最大的压力。很多项目都会购买一个现成的引擎来降低成本和提高时效。而独立开发引擎时,就要选择效率最高的开发平台。对CAD应用来说,它们并不需要显卡的各种新特性,因为它们只是用OpenGL来画线框图,而华丽的渲染效果是离线的高级软件渲染引擎完成的,所以OpenGL 1.1时代的东西在多数情况下是足足够用的。而游戏要用到大量新特性,如Effect Framework、Bump Mapping、HDR、Texture Atlas等,很多是需要将数据进行预处理的。而OpenGL只是图形输出接口,其他的工作都必须自己来做,当然也可以找现成的,不过会有许可协议、不同风格代码集成、以及可能的授权费等问题,毕竟这是商业应用。而D3D提供了D3DX库,包含了从基础数学库(支持MMX、SSE、3DNow)到模型显示的各种辅助例程,极大地节省了开发时间。在D3D和OpenGL的征战中,D3DX为D3D赢得不少支持者。

所以,技术因素在两者的选择上并没有多大影响,似乎也可以证明为什么商业开发多用D3D,业余开发多用OpenGL。但也有不少主流商业引擎是同时支持D3D和OpenGL的,不过在Windows平台上缺省都是用D3D,在Mac上只能是OpenGL,在PS3上是OpenGL ES,在XBox上是特殊版本的D3D。Mac上的OpenGL支持比Windows要好,不用担心它会fallback到软件模拟的1.1。OpenGL ES是精简的纯硬件加速的移动设备版本,而且是主要为移动设备上的游戏设计的,所以对游戏来说,个人觉得它比OpenGL更有前途。

为什么游戏偏爱D3D相关推荐

  1. FPS游戏:D3D实现游戏人物上色

    本教程是<FPS游戏:实现D3D劫持透视 (API Hook)>教程的延续篇,在上一课我们讲解了如何通过函数劫持,实现对特定角色墙后透视功能,不过我们当时使用的是全局透视,并没有找到人物模 ...

  2. FPS 游戏实现D3D透视

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  3. FPS游戏:D3D内部游戏菜单实现

    19年发布了一篇<FPS游戏:实现GDI方框透视>这篇文章,本篇文章中使用到的技术是外部GDI绘制,该绘制模式在Win10系统中如果不关闭毛玻璃效果则绘制会失效,为了解决绘制失效的窘境,故 ...

  4. 关于虚幻4引擎D3D导致频繁崩溃的保守解决方案

    1.修复dx系统.我使用360自带的dx修复工具重新卸载加载了一遍. 2.回退驱动.因为是新版30系显卡,并且还是天选air天坑机, 我将显卡驱动大概回退到两个月前. 3.回退虚幻版本.我将版本回退直 ...

  5. csol c语言运行错误,CSOL非常卡之控制台优化.doc

    CSOL非常卡之控制台优化 一:各向异性过滤 16x 二:垂直同步 关 三:平滑处理-透明度 4x(超级取样) 四:纹理过滤-质量 高质量 以上四项为修改后的设置! 下面说一下关于控制台的简单优化吧! ...

  6. 魔兽中的dx写屏(原版为英文)

    原文地址: http://www.rohitab.com/discuss/topic/34411-run-time-directx-hooking-using-code-injection-and-v ...

  7. 我是如何准备秋招互联网大厂后端学习的?

    写在前面 上周给师弟师妹们分享了我的秋招经验,总结了秋招中的一些问题,于是现在也把这些东西给发在博客上分享出来,毕竟之前也参考了很多其他人的经验,是时候回馈了. 本人末流双9硕,电子信息工程专业,ja ...

  8. osg学习(十一)osg与osgre

    OGRE和OSG本身被定位为一个纯粹的图形引擎. 其中OpenSceneGraph(简称OSG)使用OpenGL技术开发,是一套基于C++平台的应用程序接口(API).OSG开发的主要意义在于,将3D ...

  9. 关于OGRE与OSG的简单比较

    关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...

最新文章

  1. 负载均衡算法-响应速度均衡
  2. 单链表 操作的18种算法
  3. PureXXX使用手记
  4. ad中电容用什么封装_二极管在电路中到底做什么用的
  5. Google浏览器截长图 不需要借助任何插件!!!
  6. 第三十二期:MySQL常见的图形化工具
  7. Java中HashMap的常用操作
  8. 祝贺Terrylee博客园Post达到100篇
  9. THREEJS - 自定义曲线绘制
  10. JS递归算法经典案例与分析
  11. 视频插帧算法之光流法
  12. php苹果内购验证,苹果内购支付校验
  13. 22. 关于定时任务指定的时间间隔内没有完成任务的处理
  14. 汇总并对比几个数据库存储相关的知识
  15. 转载--三少三多技术开发
  16. 苹果闭门造车6年了!是否已经“翻车”?
  17. python:http.server --- HTTP 服务器
  18. 百度智能云开物工业互联网平台解决方案亮相2021服贸会成果发布会
  19. Shiro基础应用——角色和权限校验
  20. Rapidly-Exploring Random Trees(RRT)

热门文章

  1. 微信小程序和视频号通过交易组件对接打通流程
  2. 微信小程序 |基于百度AI从零实现人脸识别小程序
  3. dingding钉钉 python接口
  4. win2019离线安装.NET Framework 3.5的方法
  5. Linux 安装Redis 图解教程
  6. redhat 7.3 ppc64le环境安装Keepalived及遇到问题
  7. 法制日报:要在法律上“悉心关照”百度
  8. 汇集YOLO系列经典和前沿算法,实现高精度实时检测!
  9. oracle删除table不进回收站,清除当前用户的回收站
  10. 黑马毕向东Java课程笔记(day20-1——20-17)IO流:File类及相关方法、递归、递归的相关练习、Properties、PrintWriter类与PrintStream类、合并流与切割流