游戏和其他图形密集型应用程序使用诸如OpenGL和DirectX之类的框架。此外,它们还需要像素着色器和DX12等功能。

但是当我们可以逐像素绘制所有内容时,为什么我们需要所有这些框架和GPU功能?

首先,游戏必须以某种方式进行编译,以便逐像素绘制。这可能会使游戏具有更大的可执行性,但会更快并且可以在任何32位彩色GPU(甚至旧的)上运行吗?

我知道第一个3D游戏是逐像素绘制的,但为什么现在不这样做呢?

评论

通常,对很多事情进行一项操作要比对每一件事进行单独处理更有效,更容易考虑。

因为每个游戏都需要为每个图形卡重写。除非他们不使用图形卡,否则它们会很慢。

我认为GPU公司必须创建自己的DirectX驱动程序

“但是当我们可以逐像素绘制所有内容时,为什么我们需要所有这些框架和GPU功能?”那就是好时机。 Wolfenstein 3D,Doom,Duke Nukem 3D,Quake和90年代后期的大多数其他游戏都使用纯软件渲染(Quake提供了OpenGL渲染器作为选项)。

@MatthewRock您没有帮助。您当然可以在Docker容器中将OS与游戏捆绑在一起并分发该容器。这样,用户无需为其发行版安装库依赖项。

#1 楼

速度是不这样做的最常见原因。实际上,如果您创建自己的操作系统,则可以按照您的建议进行操作,但是由于架构原因,它的运行速度非常慢。因此,假设其速度更快是有缺陷的。即使速度更快,开发效率也会降低(例如,将工作速度提高10倍,速度提高1%)。

将数据从CPU复制到图形卡是一种操作相对较慢。复制的次数越少,更新速度就越快。因此,理想情况下,您将在GPU上拥有大部分数据,并且只更新一小部分数据。与1920x1200或更高像素相比,复制320x200像素像素之间存在巨大的差异。看到当侧面增加时,您需要更新的像素数量会平方增长。

示例:告诉GPU将图像向右移动10个像素比将像素手动复制到不同位置的视频内存要便宜位置。

为什么必须使用API​​?仅仅是因为这不是您的系统。出于安全原因,操作系统不允许您执行任何操作。其次,由于操作系统需要将硬件抽象化,因此即使操作系统正在通过某种抽象系统与驱动程序进行通讯,如果可以的话,也会使用API​​。

事实上,我对您的系统被如果您自己完成所有工作,则速度更快,接近于零。有点像比较C和汇编语言。当然,您可以编写汇编程序,但如今编译器很聪明,并且始终在不断优化。即使您会降低工作效率,也很难手动进行改进。

PS:API不会像旧游戏那样无法进行此更新。只是效率低下而已。不是因为API的思想,而是因为它的效率低下。

PPS:这就是为什么他们推出Vulkan的原因。

评论


$ \ begingroup $
看到随着边的增加,您需要更新的像素数呈指数增长。我认为是二次方的。
$ \ endgroup $
–克苏鲁
16 Mar 25 '16 at 11:45

$ \ begingroup $
“将数据从CPU复制到图形卡是一个相对较慢的操作。”这是事实,但无关紧要。即使是适度的PCI-E链接,也很容易实现以60 fps的速度复制几百万个像素(每秒仅需要几百兆字节)。
$ \ endgroup $
–可乐
16 Mar 25 '16 at 13:06

$ \ begingroup $
@ pjc50没错,但也不完全正确。 GPU专门用于在大量数据上并行运行单个程序(通常是着色器)。因此,您需要对大量数据执行相同的操作才能真正使用GPU的计算能力。如果您的程序没有,则最好在CPU上运行该程序。
$ \ endgroup $
– Nero
16-3-25在14:22

$ \ begingroup $
@Daniel $ x ^ 2 $是二次函数。指数函数为$ 2 ^ x $。指数函数的增长速度比二次函数快。
$ \ endgroup $
– Nero
16 Mar 25 '16 at 18:14

$ \ begingroup $
您谈论复制和移动,但更重要的是实际的图像生成。您必须确定在什么时候可以看到哪个对象,如何点亮,烟雾的影响等,等等。GPU经过高度优化,可以快速,并行地执行这些操作。 API使表达常见操作变得容易。
$ \ endgroup $
– IMil
16 Mar 26 '16 at 6:47

#2 楼

可以在任何32位彩色GPU(甚至是旧的32位彩色GPU)上工作吗?

这里的历史:这就是直到90年代中期图形加速器开始可用之前在PC上完成游戏的方式。它确实可以在所有硬件上正常工作,因为硬件的工作并不多。

图形加速器通过使用专用的硬件和并行性,可以比CPU更快地绘制像素。加速器包含许多处理器核心。台式计算机将根据年龄使用1-8个内核。我的GTX970Ti显卡具有1664(一千六百六十四!)个内核。

然而,加速器并未标准化,通常包含怪异的计算机体系结构技巧以实现其速度。为了编写未针对特定牌子和型号定制的游戏,需要存在一个API。这就是DirectX,GL和着色器语言的用途。实际上,编写着色器与编写直接绘制像素的程序最接近-只是卡将并行为您运行该程序的一千个副本,每个像素一个。

评论


$ \ begingroup $
我的笔记本电脑的APU有256个着色器内核@ 686MHZ,而我的平板电脑有192个。
$ \ endgroup $
– Suici Doga
16 Mar 25 '16 at 13:38

$ \ begingroup $
嗨,Titan X拥有5760个内核。
$ \ endgroup $
–丹尼尔(Daniel)
16-3-25在18:02



$ \ begingroup $
@Daniel有没有泰坦X以超高速度<30fps的游戏。泰坦X非常强大
$ \ endgroup $
– Suici Doga
16-3-26在2:33



$ \ begingroup $
嗯,其中之一,也许是:maximumpc.com/10最符合图形要求的PC游戏
$ \ endgroup $
–丹尼尔(Daniel)
16 Mar 26 '16在2:46

$ \ begingroup $
@Daniel这些游戏的开发人员必须需要大约2-4张Titan X卡:)
$ \ endgroup $
– Suici Doga
16-3-26的13:30

#3 楼

只是为了补充joojaa的答案,事物仍在逐像素绘制。您只是使用顶点着色器/汇编器/光栅化器生成像素,然后使用片段着色器对其进行纹理处理和照明。这一切都是在90年代用软件完成的,当时您的视频卡只不过是一个阻击器和一个帧缓冲区,但它的运行速度真是太慢了。因此是现代GPU的发明。

发生的绘图数学与《毁灭战士》时代基本相同,但是现在它在成千上万的着色器ALU上运行,而不是在少数CPU内核上运行。这些API映射到幕后基本相同的GPU指令集。他们只是在这里阻止您不得不在多个供应商平台上编写大量粗糙的GPU组件。