游戏和其他图形密集型应用程序使用诸如OpenGL和DirectX之类的框架。此外,它们还需要像素着色器和DX12等功能。
但是,当我们可以逐像素绘制所有内容时,为什么需要所有这些框架和GPU功能?
首先,游戏必须以某种方式进行编译,以便逐像素绘制游戏。这可能会使游戏的可执行文件更大,但是会更快并且可以在任何32位彩色GPU(甚至旧的)上运行吗?
我知道最初的3D游戏是逐像素绘制的,但是为什么现在不这样做呢?
游戏和其他图形密集型应用程序使用诸如OpenGL和DirectX之类的框架。此外,它们还需要像素着色器和DX12等功能。
但是,当我们可以逐像素绘制所有内容时,为什么需要所有这些框架和GPU功能?
首先,游戏必须以某种方式进行编译,以便逐像素绘制游戏。这可能会使游戏的可执行文件更大,但是会更快并且可以在任何32位彩色GPU(甚至旧的)上运行吗?
我知道最初的3D游戏是逐像素绘制的,但是为什么现在不这样做呢?
Answers:
速度是不这样做的最常见原因。实际上,如果您创建自己的操作系统,则可以按照您的建议去做,但由于架构原因,它的运行速度非常慢。因此,假设其速度更快是有缺陷的。即使速度更快,开发效率也会降低(例如,工作速度提高10倍,速度提高1%)。
将数据从CPU复制到图形卡的操作相对较慢。复制的次数越少,更新速度就越快。因此,理想情况下,您将在GPU上拥有大部分数据,并且只更新一小部分数据。与1920x1200或更高像素相比,复制320x200像素像素之间存在巨大的差异。看到随着边的增加,您需要更新的像素数会平方增长。
示例:告诉GPU将图像向右移动10个像素比将像素手动复制到不同位置的视频内存要便宜。
为什么必须通过API?仅仅是因为这不是您的系统。出于安全原因,操作系统不允许您执行任何操作。其次,由于操作系统需要将硬件抽象化,因此即使OS也在通过某种抽象系统(如果需要)与API进行驱动程序通信。
实际上,如果您自己完成所有工作,我会评估您的系统更快的可能性,接近于零。有点像比较C和汇编语言。当然,您可以编写汇编程序,但如今的编译器非常聪明,并且始终在不断优化。即使您可以提高生产率,也很难手动进行改进。
PS:API不会像以前的游戏一样无法进行此更新。只是效率低下而已。不是因为API的思想,而是因为它是低效的时期。
PPS:这就是为什么他们推出Vulkan的原因。
See the number of pixels you need to update grows exponetially when the sides grow.
我认为是二次方的。
在任何32位彩色GPU(甚至旧的)上工作?
这里的历史:这是直到90年代中期图形加速器开始可用之前在PC上完成游戏的方式。实际上,它确实可以在所有硬件上运行,因为硬件并没有做很多事情。
图形加速器通过使用专用的硬件和并行性,可以比CPU 更快地绘制像素。加速器包含许多处理器核心。台式计算机将根据年龄使用1-8个内核。我的GTX970Ti显卡具有1664(一千六百六十四!)个内核。显然,这在很大程度上要击败PC。
但是,加速器不是标准化的,通常包括怪异的计算机体系结构技巧以实现其速度。为了编写未针对特定牌子和型号定制的游戏,需要存在一个API。这就是DirectX,GL和着色器语言的用途。事实上,写着色器是最接近于编写直接绘制像素的程序-它只是该卡将并行运行该程序的千人副本给你,每个像素一个。