黑基网 首页 学院 编程开发 查看内容

为什么游戏开发者更偏爱 Windows?

2017-8-3 10:36| 投稿: lofor |来自: 互联网

摘要: 这是 Software Engineering Stack Exchange 上的一篇回答,回答了为什么游戏开发者更偏爱为 Windows 开发游戏。仅仅是因为 Windows 的用户基数吗?还是说 DirectX 要更优于 OpenGL,即使 OpenGL 是跨平台的?作者最 ...

这是 Software Engineering Stack Exchange 上的一篇回答,回答了为什么游戏开发者更偏爱为 Windows 开发游戏。仅仅是因为 Windows 的用户基数吗?还是说 DirectX 要更优于 OpenGL,即使 OpenGL 是跨平台的?

作者最后更新于 2013 年,其中详细讲了 OpenGL 和 Direct3D (D3D) 之间的纠葛,从历史的角度解释了为什么 Windows 上有更多的游戏,而支持 OpenGL 的 Linux 上却几乎没什么游戏。

This a long story...

冲突的诞生

在上世纪 90 年代的某一天,微软环顾四周,看到 SNES 和 Sega Genesis 都很不错,上面有大量杰出的游戏。再回过头来看看自家的 DOS,不同于那些为 SNES 开发游戏的开发者了解用户将拥有什么硬件,DOS 的开发人员必须得为多种可能的配置进行开发,这听起来就不是什么好事。

之后微软为了促进 Windows 上的游戏开发,开始构建统一的图形、音频和输入等功能的 API。

这样 DirectX 就诞生了。

3D 加速器这在几个月后出现,而微软遇到了麻烦。DirectX 的图形组件 DirectDraw 只能处理 2D 图形。所以,微软买了一些现成的中间件,并将其改造为 Direct 3D version 3。这个举动广受诟病,因为看 D3D v3 的代码简直是种煎熬。

当时还在 Id Software 的大神 John D. Carmack 看了一下,就把它扔进了垃圾桶,并决定投向 OpenGL 一边。

而这时微软在忙着和 SGI 一起开发 Windows 版本的 OpenGL,从而使一些原来必须在高档图形工作站上运行的大型 3D 图形处理软件也可以在微型计算机上运用,游戏这时还没在他们的考虑之内。

当时早期的消费级显卡并没有支持 OpenGL,但这并没有影响 Carmack 将雷神之锤移植到 OpenGL 的热情。

最终,因为当时硬件快速的发展,使得之后能够在硬件中实现大多数的 OpenGL 功能,NVIDIA 是第一个支持完整 OpenGL 的厂商,其他的厂商也都在努力。虽然最终只有 NVIDIA 和 ATI(现在是 AMD)存活了下来,但他们都对 OpenGL 有着很好的支持。

冉冉升起的 OpenGL

因此,当时的舞台变成了 Direct3D vs OpenGL。

OpenGL 由 OpenGL 架构审查委员会(ARB)负责维护。ARB 由许多图形行业厂商、操作系统厂商等共同组成。Apple 和微软在不同时期也都是 ARB 的成员。

当时 3dfx 公司带来了 Voodoo2,这是第一个支持多重纹理的显卡。虽然 3dfx 强烈反对 OpenGL,但 NVIDIA 却很喜欢。所以 ARB 就发布了一个名为 GL_ARB_multitexture 的扩展来支持多重纹理。

同时 Direct3D 也来到了 v5 版本。这时 D3D 已经变得很可靠了,只是还有一个问题:不支持多重纹理。。。

然而幸好当时并没有太多人用到多重纹理。因为以当时大多数人的硬件条件来看,多重纹理会占用过多的性能,很多情况下也不见得就比多次渲染更优秀。因此,游戏开发者就更倾向于确保他们的游戏能适用于不支持多重纹理的旧设备,所以当时很多游戏都没有选择马上支持多重纹理。

这就正好让 D3D 没有被甩下(运气真是好)。

时光流逝,NVIDIA 发布了 GeForce 256(第一款 GeForce,第一个 GPU),这直接在之后的两年里终结了显卡厂商间的战争。其主要卖点是将 T&L (Transform & lighting) 集成到显核中。不仅如此,因为 NVIDIA 是如此的喜欢 OpenGL,以至于其 T&L 引擎对 OpenGL 非常的高效。

3D 图形是由复杂的坐标转换和光源运算组成的,当显卡还没有 T&L 功能时,坐标处理和光源运行都是由 CPU 来处理的,CPU 运算速度越快,游戏越流畅。当图形芯片具有 T&L 功能之后,CPU 就得以从繁重的运算中解脱出来。

之后,Direct 3D v6 也出来了,支持多重纹理,但又没有硬体 T&L。。。而 OpenGL 则一直有一个 T&L 管道,尽管在 256 之前是用软件实现的。所以,这让 NVIDIA 将其转换为硬件解决方案非常的简单。

而 D3D 直到 v7 才终于得到了硬体 T&L 的支持。

着色器的黎明,OpenGL 的黄昏

然后,GeForce 3 出来了,同时也发生了很多事情。

微软下定决定不再“迟到”。因此,他们决定去和 NVIDIA 好好谈谈,而不是看到 NVIDIA 做了什么,事后再去复制。

这使得 GeForce 3 和 D3D v8 同时推出。当然这也使得 GeForce 3 影响到了 D3D v8 的着色器设计。Shader Model 1.0 的像素着色器几乎就是为 GeForce 3 量身定做的。

但戏剧性的事情发生了,当时 ATI 推出了 Radeon 8500,而 8500 的 pixel processing pipeline 要比 GeForce 3 的更强大。所以,微软又发布了 Shader Model 1.1,使得 8500 成为全球首款完整支持 DirectX 8.1 的产品。

这时另一边的 OpenGL 又在干什么呢?

因为 NVIDIA 是如此的喜欢 OpenGL,所以当 GeForce 3 推出时,他们也发布了大量的 OpenGL 扩展,只不过是 NVIDIA only。自然 8500 一个也用不了。

因此 ATI 也马上发布了一系列的 OpenGL 扩展,只不过 ... ATI only。

所以,如果当时你在使用 OpenGL,你得同时装上 NVIDIA 和 ATI 发布的扩展,就为了用上着色器。

你可能要问了:“OpenGL ARB 在哪里,难道他们看不出来这有多蠢吗?”

这就是世事无常的地方,上面我们提到的让 OpenGL 甩开 D3D 的 ARB_multitexture(支持多重纹理) 影响了这一切。

从一个局外人的角度来看,当时 ARB 似乎打算完全避免着色器。他们认为,如果他们将足够的可配置性从固定功能管道上打通到底层,那么它们就可以拥有几乎等同于着色器的能力。

所以 ARB 就据此发布了扩展。而之后每个名字中带有 "texture_env" 的扩展都是为了修补这个老旧的设计。在 2011 年时,如果你检查注册表:在 ARB 和 EXT 之间,会有 8 个这样的补丁,有些还进入到了 OpenGL 核。

当时微软还是 ARB 的一员,不过他们在 D3D v9 的时候退出了。所以有人认为微软完全有可能以某种方式破坏了 OpenGL。不过作者不太认可这种说法:第一,ARB 是每个成员一票制,微软没办法独自就做成这件事;第二,ARB 不需要微软的捣乱,也会自己作死(后面会讲到)。

ARB 可能是受到 ATI 和 NVIDIA(两个活跃成员)的威胁,在坚持了足够长的时间后,最终还是提供了着色器。

想听更蠢的事?

之前我们提到的硬体 T&L,为了尽可能的发挥其性能,我们需要将顶点数据存储在 GPU 上。毕竟,是 GPU 实际在使用你的顶点数据。

在 D3D v7,微软推出了顶点缓冲区(Vertex Buffer)的概念。想知道 OpenGL 什么时候才有类似的东西吗?当然,NVIDIA 作为 OpenGL 的狂热爱好者,在 GeForce 256 推出的时候就发布了 vertex array range extension,当然依旧是 NVIDIA only = =,而 ARB 居然两年之后才提供类似的功能。

而这是在他们通过了顶点和片段着色器之后,这就是 ARB 用于解决跨平台 GPU 顶点缓存方案的时间。

因此,OpenGL 有这么一段陷入混乱的时间:没有着色器,没有 GPU 顶点缓存,而 D3D 都有,还能比这更惨吗?

一个语言把它们全毁了

答案是可以的。: )

3Dlabs 是一家现在已经停业的公司,作者认为他们给了已经很惨的 OpenGL 更加猛烈一击。虽然 OpenGL 因为 ARB 的混乱,导致自己落后于 D3D。但也许 3D Labs 所做的才真正导致了 OpenGL 现如今的市场占有率(不过现在因为移动设备,OpenGL 又回来了,虽然又有了 Vulkan)。

他们设计了 OpenGL Shading language。

当时 3D Labs 是一家正在衰弱的公司,在自己唯一的工作站市场上还被 NVIDIA 逼到了绝境。如果 NVIDIA 赢了,他们就死了。

因此,为了在这个似乎不需要他们产品的世界中最后努力一下,3D Labs 在一个游戏开发者大会上展示了被他们称作 "OpenGL 2.0" 的东西。这是一个完全从头重写的 OpenGL API。这在当时是有道理的,看看当时 OpenGL 里那些晦涩难懂的 API 你就知道了。

3D Labs 建议的一部分是一个着色器语言(GLSL),不同于当时的 ARB 跨平台扩展,他们的着色器语言是「高级的」。

在这之前大部分着色器都通过一种低级的,类似于汇编的语言来编写的。这意味着作为一名开发人员,你必须像多年前使用汇编语言的时代那样,自己管理寄存器,分配变量以及优化。

微软当时也在开发自己的高级着色器语言 - HLSL,只不过二者走的是完全不同的方向。

3D Labs 的着色器语言最大的问题在于它是内置的,而微软同时还发布了编译器,能够生成 Shader Model 2.0(或更高版本的 Shader Model)的汇编代码,开发者可以将其编入 D3D 中。在 D3D v9 中,D3D 并不直接包含 HLSL,这是一个很好的抽象,而且还是完全可选的。开发者如果愿意,完全可以去到编译器后面再进行调整来获得更好的性能。

而 3D Library 的语言则完全没有这些东西。在 D3D,以及 OpenGL 的早期汇编语言中,开发者可以组合匹配顶点和像素着色器,只要接口兼容,就可以任意搭配顶点和着色器。

GLSL (OpenGL Shading Language) 就没这么好了。顶点和 fragment shaders 被组合在了一起,称作 "program object"。这就导致了一个大问题。

3D Labs 觉得他们很聪明,他们将 GLSL 的编译模型构建在 C/C++ 的基础上。开发者将 .c 或 .cpp 文件编译成目标文件,再将一个或多个这样的文件链接到程序中。这就是 GLSL 的编译方式:将着色器编译成着色器对象,然后将这些对象放在程序对象中,并链接在一起,形成实际的程序。

这种做法虽然带来了类似库的好处。但在实际中也让文件被编译了两次,在将 .c 或 .cpp 编译成目标文件时编译了一次,链接时又编译一次。特别是 NVIDIA 的编译器基本都运行了两次编译,因为它没有产生某种中间代码,而是编译、给出结果,然后在链接的时候再编译一次。

这相比 D3D 就做了更多的编译工作。或许我们不应该苛责 3D Labs ,因为 ARB 最终同意并整合了他们的语言(但没有支持他们提出的 OpenGL 2.0 中的其他部分)。

最悲伤的事情莫过于:3D Labs 几乎都是对的。GLSL 当时是基于标量(GPU 的一种计算方式)的,因为他们的硬件设备都是基于标量的(而当时 HLSL 是基于矢量的)。后来显卡厂商也都转到了标量上来。

唯一的问题就是 3D Labs 在错误的时间做了正确的事。为了防止未来被抛弃,反而让自己错失了当下。

当然现在的 GLSL 已经变得不错了。但在当时呢?实在太差了,OpenGL 也因此受了很多苦。

跌落神坛

3D Labs 尽了自己的努力,而 ARB 却搞砸了一切。

你或许听说过,到 OpenGL 2.1 时,已经有了很多的历史遗留问题。API 不再易用,完成一件事能有 5 种方法,还不知道哪种是最快的。

所以 ARB 终于决定要重新设计一次 OpenGL 了,这和 3D Lab 的 "OpenGL 2.0" 类似。但换成了 ARB 在背后推动,他们管其叫做 "Longs Peak"。

花些时间来改进 API 有什么不对?时机不对!

当时微软终于露出了破绽,他们正在忙着 Vista,而为了 Vista 微软决定在显示驱动程序中进行一些必要的修改,迫使厂商要提供 graphics memory virtualization 等等给操作系统。

而且微软还绑定了 D3D 10 在 Vista 上,即使你的硬件达到了 D3D 10 的标准,但如果没安装 Vista 也还是没法使用 D3D 10。

后来事实证明 Vista 是一个“失败”的操作系统,这本来是 OpenGL 赶上的绝佳时机,如果 ARB 没有忙于 Longs Peak 的话。

而现实是 ARB 用了一年半到两年的时间来改进 API。在 OpenGL 3.0 终于推出的时候,win 7 已经马上就要推出了,而且大多数游戏开发者当时也不在意能不能用到 D3D 10 了。毕竟,你不让我用,那我在 D3D 10 的机器上跑 D3D 9 的程序不就行了。还有不少开发者从 PC 转去做主机开发了。

现在看来,如果 OpenGL 在微软忙于 Vista 时,在 Win XP 上提供和 D3D 10 类似的功能,也许 OpenGL 还有转机(不过现在随着移动设备的崛起,OpenGL 还有的玩),可惜 ARB 却选择了去改造 API。而在这之后微软也再没有给 OpenGL 任何超车的机会了(至少在桌面游戏领域)。

这就是 OpenGL vs. Direct3D 的故事。

原文:Why do game developers prefer Windows?
小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文搜集整理自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,请我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论


新出炉

返回顶部