OpenGL,SFML和SDL对软件渲染有什么优势?

我开始观看手工制作的英雄stream ,凯西Muratori创建一个游戏引擎,而不使用框架或类似的东西。 昨天我到了他展示如何在屏幕上绘制图像的部分。 据我了解,他只是分配一些像他想要画的大小一样大的内存。 然后他创建了一个位图,传递给他分配的缓冲区内存,并使用特定于OS的函数将其绘制到屏幕上。

这似乎很直接。 我使用GameMaker,改为Love2D,使用Sprite Kit工作一点点,但我一直在想,在这个有时令人困惑的图层下究竟发生了什么。

既然如此,为什么即使打扰使用graphics库(OpenGL,SFML,SDL,…),当你所要做的只是简单地分配一些缓冲区,传递一个位图,并将其绘制到屏幕上?

如果你想绘制不同的东西给你屏幕,你只需将它们写入到你的位图,然后传递到缓冲区。 我对编程相当陌生,但对我来说这似乎很简单。 如果我错了,请纠正我。

这不仅仅是执行的速度,也是关于简单。 虽然在这个例子中使用的软件渲染比使用硬件加速(即GPU)要慢很多,但在屏幕上绘制一些位图是一件简单的事情,你不会注意到性能的下降。

然而,像三角形栅格化,深度sorting等低级活动是GPU可以通过几个命令隐式处理的理解概念。 在软件模式下重新实现这些function本质上是重新发明的。 如果你想了解如何完成渲染,那么这很好,我自己写了一个3D软件渲染器来探索一下,但是在大多数情况下,当OpenGL能够更快地完成渲染的时候,这是浪费时间的盒子。

你给出的例子听起来非常基本,只是在屏幕上画一个图像,因此实现起来很简单。 一旦你开始复杂的分层,你会发现正确渲染的一切都变得越来越复杂。 在3D软件渲染的Quake日子里,人们不得不做的东西是疯了,尽管我很欣赏你还没有那么做。

我的问题是:当你所要做的只是简单地分配一些缓冲区,传递一个位图并将其绘制到屏幕上时,为什么还要使用像打开gl,sfml,sdl这样的东西呢?

简短:因为它的速度很快(OpenGL,DirectX)。

长:

你可能会认为你可以自己做这一切。 将像素绘制到屏幕上。 你可以写一个小型的库来绘制形状,如四边形或三角形。 这当然会起作用。 这里有很多图书馆。 其中一些甚至实现了OpenGL规范(所以它们就像是一个用于opengl的软件端),它将完全实现Casey Muratori的function。 他们在软件端计算一切,在软件端设置像素并将结果写入屏幕。

然而这很 。 最终将执行所有这些事情的CPU不是用于这种情况。 这就是GPU的用途。 OpenGL的function(除非它是一个软件实现过程)是把你所要做的所有事情都做好,把所有的数据,所有的绘图调用,几乎所有的东西都放到显卡上,然后告诉GPU去做。 GPU是专门为这种工作而制作的。 乘以浮点数(这就是你绘制3D场景时做的很多 )并执行着色器。 和此并行。 为了让您了解GPU的速度,请考虑全屏1920×1080像素的3D场景。 这些是乘以2,073,600像素绘制。 对于每一个像素,GPU将至less运行一次片段着色器,大部分时间不止一次。 现在,假设我们以每秒60帧的速度运行。 这意味着,GPU每秒钟运行分片着色器2,073,600 * 60 = 124,416,000次 。 你认为你可以在你的CPU上做这样的事情吗? (这是一个相当简单的解释,还有更多的事情要考虑,比如你靠近对象透支多less像素,你使用了多lessMSAA等等,但是每秒124,416,000次可能是你能得到的最低的,而你用一个简单的场景就可以轻松得多60fps)

那是什么OpenGL和Direct3D做什么引擎@Uri波波夫回答。

他所做的就是软件渲染 ,OpenGL所做的就是GPU渲染

他们之间有什么区别? 速度和记忆。

栅格化(在屏幕上填充三角形)需要一些时间。 如果你在CPU上这样做,你基本上就把这段时间从游戏逻辑中解放出来,特别是如果它没有被优化的话。

没关系,图像有多小,他需要为它分配一定的内存。 GPU有一个这样的video内存。

尽管其他人的回答比我能给出的答案更正确,但我想指出一个根本性的误解,那就是我认为你的问题是软件开发的工作原理。 虽然总是有可能在没有框架的情况下“自己”做事情,而且这样做通常会带来巨大的教育好处,但现实并不是现代软件的创造。

有人创建了运行在其上的硬件和机器语言。 其他人创建更高级别的语言和编译器,驱动程序和操作系统,graphics库等等。 我们每个人都建立在前人的工作上。 这不仅是“好”,这是一个要求。

您正在绘制工具链中任意点的“可接受”或不在线的行。 你可以简单地说:“为什么在组装时要用C ++?”,或者“为什么要依靠键盘驱动程序,就像读取电线上的电压并自己计算一样? 一天中没有足够的时间,或者一生中有几年,每个人都可以自己做一切。

这不仅适用于软件开发,而且适用于现代生活。 你有没有听说过从头开始建造烤面包机的家伙? http://www.thomasthwaites.com/the-toaster-project/ 。 花了很长时间和很多努力。 烤面包机。 尝试构建一切必要的东西 ,以完成一个video游戏以外的所有你自己!

引擎做的更多,只是画一幅画面。 他们处理照明,阴影,input,碰撞检测。 即使只是渲染部分比将缓冲区推入屏幕更复杂。 对于3D场景,尤其是对于比位图更复杂的数据,您需要进行大量的计算。 让我给你一个汽车的比喻:你所描述的简单是汽车的尾气。 您只需制作一个合适尺寸的管道,然后将气体从一端推向另一端。 然而,这与汽车机制中唯一发生的事情不同。

上面的答案是非常好的,但没有一个真正的答案是为什么OpenGL和这样的首选的最重要的原因。 主要原因是利用专门devise的专用硬件来处理诸如在GPU(屏幕)上渲染数百万像素之类的东西。

通过软件渲染,使用CPU,渲染器将逐个循环遍历位图上的所有像素,并发出命令在屏幕上显示每个像素。 所以,如果你正在渲染一个1000×1000大小的图像,你的CPU超过100万循环。 毕竟,他们的devise是考虑到控制的。 很多情况下,从一套指令跳到另一套指令,严格的控制stream向。 然而,GPUdevise的知识是它会在屏幕上像素上很多类似的循环。 GPU将采取循环迭代1000000次,并将工作划分为大量内核,以便并行工作,并相互独立。 因此,与CPU不同的是,GPU每遇到一个if-else条件,它就会将两个代码分支处理到自己的两个核心,然后在最后,它会查看条件评估的结果并放弃不需要的分支的结果(这就是为什么很多GPU着色器中的if-else条件被忽视;它们总是浪费)。

所以是的,GPU是围绕着并行而建立的。 这使得他们的像素工作比CPU更快。

请参阅我是否真的需要使用graphicsAPI?

当然,你可以要求一个缓冲区,在其中设置一些位并将其写入屏幕。 这实际上是在PC上进行graphics编程的唯一方法,直到3DFX在90年代中期出现graphics加速器。 即使在Windows中,DirectX也可以直接访问video内存。

但在非PC硬件,专用游戏机上,总是有技术通过从处理器卸载工作来加速graphics。 即使是Atari 2600也有“硬件精灵”,部分原因是它没有足够的RAM来存放帧缓冲区。

后来(80年代中期)的游戏控制台针对平台游戏进行了优化。 再次,没有framebuffer; 而程序员可以指定网格 :

Genesisgraphics硬件由2个可滚动的平面组成。 每架飞机都由瓷砖组成。 每个瓦片是8×8像素正方形,每像素4位。 每个像素可以有16种颜色。 每个瓷砖可以使用4个颜色表中的一个,所以在屏幕上你可以一次获得64种颜色,但是在任何特定的瓷砖中只能得到16种颜色。 瓷砖需要32个字节。 有64K的graphics内存。 这将允许2048独特的瓷砖,如果内存没有别的用途。