你能编写纯GPU游戏吗?

时间:2009-11-24 10:26:38

标签: gpu

我是CS硕士生,下学期我将不得不开始研究我的论文。我在提出论文想法方面遇到了麻烦,但我认为它与计算机图形学有关,因为我对游戏开发充满热情,并希望有朝一日能够成为一名职业游戏程序员。

不幸的是,我对3D计算机图形领域有点陌生,我参加了一门关于这门课程的本科课程,并希望下学期能修一门高级课程,而且我已经阅读了各种各样的书籍和文章了解更多。尽管如此,如果我现在提出一个总的论点想法,然后花时间学习它来准备我的论文提案,我的主管认为它会更好。我的主管为我提供了一些好主意,但我宁愿自己做一些更有趣的事情,这有希望与游戏有关,让我有更多机会了解更多有关该领域的知识。我不在乎它是否已经完成,对我而言,论文更多的是一个深入了解事物并自己做大量工作的机会。

我对GPU编程知之甚少,而且我还在学习像CUDA这样的着色器和语言。我的一个想法是在GPU上编程整个游戏(或尽可能多),包括所有游戏逻辑,AI和测试。这是受到关于GPGPU的阅读文章和this one等问题的启发。我不知道我的知识是多么可行,而且我的主管对最近的GPU知之甚少。我肯定有时间我可以自己回答这个问题,但如果我事先能够知道答案,那么我也可以考虑其他想法。

所以,如果你已经走到这一步,我的问题是:只使用着色器或像CUDA这样的东西,你能制作一个充分利用GPU的原始功能和并行性的简单3D游戏吗?或者我错过了GPU和CPU之间的一些限制或区别,这些限制或差异总会使我的大部分代码绑定到CPU?我读过关于在GPU上运行的物理引擎,为什么不是其他所有呢?

9 个答案:

答案 0 :(得分:17)

免责声明:我已经完成了博士学位,但从未监督过我自己的学生,因此请尽量采取我所说的所有内容!

我认为尝试将尽可能多的游戏强加到GPU上是一个很好的方式来开始你的项目,但最终你的工作点应该是:“这件事是重要的一部分许多游戏,但它现在的状态并不适合GPU:这是我如何修改它以便它适合“。

例如,fortran提到AI算法是一个问题,因为它们倾向于依赖递归。是的,但是,这不一定是一个交易破坏者:将递归算法转换为迭代形式的艺术受到学术界的青睐,并将成为你论文的一个很好的中心部分。

然而,作为一名硕士生,你没有太多时间,所以你真的需要很快识别出感兴趣的内核。作为你主人的结果的一部分,我不打算让整个游戏真正适应GPU:我会把它当作一个练习,看看哪个部分不适合,然后单独关注那个部分。

但要小心选择主管。如果您的主管没有任何相关经验,您应该选择其他人。

答案 1 :(得分:5)

我还在等待一个完全在GPU上运行的Gameboy模拟器,这只是游戏ROM本身和当前用户输入,并产生一个显示游戏的纹理 - 可能是声音输出的第二个纹理:)< / p>

主要问题是您无法访问GPU的持久存储,用户输入或音频输出。根据定义,这些部件必须在CPU上(即使具有HDMI的卡具有音频输出,但我认为您无法通过GPU控制它)。除此之外,您已经可以将游戏代码的大部分内容推送到GPU中,但我认为这对于3D游戏来说还不够,因为有人必须将3D数据提供给GPU并告诉它应该将哪些着色器应用于哪个部分。您无法真正随机访问GPU上的数据或运行任意代码,有人必须进行设置。

前段时间,您只需使用源数据设置纹理,结果数据的渲染目标以及将进行转换的像素着色器。然后,您使用着色器渲染四边形到渲染目标,这将执行计算,然后回读纹理(或使用它进行进一步渲染)。今天,第四代和第五代着色器(Shader Model 4.0以及DirectX 11中的任何一个)使事情变得更简单,因此您可以更容易地拥有更大的着色器和访问内存。但是他们仍然必须从外部进行设置,而且我不知道今天的事情如何在帧之间保持数据。在最坏的情况下,CPU必须从GPU读回并再次推送以保留游戏数据,这总是很慢的事情。但是如果你真的可以达到单个通用设置/渲染周期足以让你的游戏运行的程度,你可以说游戏在GPU上运行。但是,代码与普通游戏代码完全不同。 GPU的大部分性能来自于它们在数百甚至数千个并行着色单元中执行相同的程序,并且您不能只编写可以将图像绘制到特定位置的着色器。根据定义,像素着色器始终在一个像素上运行,而其他着色器可以在任意坐标上执行操作,但它们不处理像素。我想这并不容易。

我建议试试我说过的观点。在我看来,最重要的是在帧之间保留状态,因为如果你不能保留所有数据,那么一切都是不可能的。

答案 2 :(得分:3)

首先,我不是计算机工程师所以我的假设甚至不能成为一粒盐,也许是纳米尺度。

  • 人工智能?没问题。谷歌有无数的神经网络示例并行运行。示例:http://www.heatonresearch.com/encog
  • 寻路?您只需尝试一些已经在互联网上的并行寻路算法。其中只有一个:https://graphics.tudelft.nl/Publications-new/2012/BB12a/BB12a.pdf
  • 绘图?使用dx或gl与cuda或cl的互操作性,因此绘图不会跨越pci-e lane。甚至可以在角落进行光线追踪,因此不再进行z-fighting,即使是使用低深度限制的主流gpu也可以使用纯光线跟踪屏幕。
  • 物理?最简单的部分,只是迭代一个简单的Euler或Verlet集成,并且如果错误的顺序很大,则经常进行稳定性检查。
  • 地图/地形生成?你只需要一个Mersenne-twister和一个三角形。
  • 保存游戏?当然,您可以在写入缓冲区之前并行压缩数据。然后,调度程序通过DMA将该数据逐段写入HDD,因此没有延迟。
  • 递归?使用main vram而不是本地内存编写自己的堆栈算法,以便其他内核可以在波前运行,GPU占用更好。
  • 需要太多整数?您可以转换为浮点数,然后使用所有核心执行50-100次计算,然后将结果转换回整数。
  • 分支太多了?计算两种情况,如果它们很简单,那么每个核心都在线并完成同步。如果没有,那么你可以自己设置一个分支预测器,以便下次使用你自己的正版算法预测硬件(可能是吗?)。
  • 需要太多内存?您可以向系统添加另一个GPU并打开DMA通道或CF / SLI以加快通信速度。
  • 在我看来,最难的部分是面向对象的设计,因为它非常奇怪并且依赖于硬件来在gpu中构建伪对象。对象应该在主机(cpu)内存中表示,但它们必须在gpu中的许多数组中分开才能高效。主机内存中的示例对象:orc1xy_orc2xy_orc3xy。 gpu内存中的示例对象:orc1_x__orc2_x__ ... orc1_y__orc2_y__ ...

答案 3 :(得分:3)

答案已经在6年前被选中了,但对于那些对实际问题感兴趣的人,Shadertoy,一个实时编码的WebGL平台,最近添加了&#34; multipass&#34;功能允许保持状态。

这是在Gpu上运行的live demo of the Bricks game

答案 4 :(得分:2)

  

我不在乎它是否已经存在   完成了,对我来说,论文更像是一个   学习东西的机会   深度和做我​​的实质性工作   自己的。

那么你对论文的看法是完全错误的。 论文必须是原创性研究。 - &gt;编辑:我正在考虑博士论文,而不是硕士论文^ _ ^

关于您的问题,GPU的指令集和功能非常适用于矢量浮点运算。游戏逻辑通常做很少的浮点和很多逻辑(分支和决策树)。

如果您查看CUDA wikipedia page,您会看到:

  

它使用无递归,   C的无函数指针子集   语言

所以忘记在那里实现任何AI算法,它们本质上是递归的(比如A *用于寻路)。也许你可以用堆栈来模拟递归,但如果不明确允许它,那应该是有原因的。没有函数指针也限制了使用调度表根据游戏状态处理不同操作的能力(你可以再次使用链式if-else结构,但那里有些味道不好)。

语言中的这些限制反映出底层硬件主要被认为是做流处理任务。当然有一些解决方法(堆栈,链接if-else),理论上你可以在那里实现几乎任何算法,但它们可能会使性能大打折扣。

另一点是关于处理IO,如前所述,这是主CPU的任务(因为它是执行操作系统的任务)。

答案 5 :(得分:2)

在一个主题上做一个硕士论文是可行的,并且当你开始时,使用你的工具是不熟悉的。但是,这是一个很大的机会!

当然,硕士论文应该很有趣。但最终,你必须通过区分,这可能意味着要解决你已经掌握的困难主题。

同样重要的是你的主管。你必须解决他们表现出兴趣的一些问题 - 他们自己熟悉 - 以便他们能够对帮助取得好成绩感兴趣。

你有很多业余爱好的时间去抓痒,你将在未来拥有更多的爱好时间也毫无疑问。但不幸的是,硕士论文时间不是爱好的时间。

答案 6 :(得分:1)

虽然今天的GPU具有一些巨大的计算能力,但无论像CUDA和OpenCL这样的东西都限制在一组有限的用途中,它们更适合于计算一般事物,而像SSE这样的扩展可以加速特定的常见的任务。如果我没弄错的话,有些GPU无法在硬件中划分两个浮点整数。当然,与5年前相比,情况有了很大改善。

开发完全在GPU中运行的游戏是不可能的 - 它需要CPU在某个阶段执行某些东西,但是让GPU执行的不仅仅是图形(和游戏的物理效应肯定会很有趣,因为游戏开发者对PC的问题最大的问题就是不得不应对各种机器规范,因此必须限制自己采用向后兼容性,使事情复杂化。系统的体系结构将是一个至关重要的问题 - 例如,Playstation 3能够在CPU和RAM,GPU和视频RAM之间实现每秒数GB的吞吐量,但访问GPU内存的CPU仅能达到12MiB /第

答案 7 :(得分:1)

您可能正在寻找的方法称为“通用GPU”的“GPGPU”。好的起点可能是:

关于这种方法取得惊人成功的谣言已经存在了几年,但我怀疑这将在几年后成为日常实践(除非CPU架构发生很大变化,并使其过时)。

这里的关键是并行性:如果您遇到需要大量并行处理单元的问题。因此,可能神经网络或遗传算法可能是用GPU的力量攻击的一系列问题。也许还在寻找加密哈希中的漏洞(在GPU上破解DES会产生一个很好的论点,我想:)。但是需要高速串行处理的问题似乎并不适合GPU。因此,模仿GameBoy可能超出范围。 (但可以考虑模拟一组低功率机器。)

答案 8 :(得分:1)

我认为处理针对多个核心CPU和GPU的游戏架构的项目会很有趣。我认为这仍然是一个正在做大量工作的领域。为了利用当前和未来的计算机硬件,将需要新的游戏架构。我参加了GDC 2008,并且有与此相关的ome会谈。 Gamebryo有一个有趣的方法,他们创建线程来处理计算。您可以指定要使用的核心数,以便在不匮乏可能是多核的其他库时使用。我想这些计算也可以针对GPU。 其他方法包括针对不同核心的不同系统,以便可以并行完成计算。例如,第一次分裂谈话建议将渲染器放在自己的核心上,将游戏的其余部分放在另一个核心上。还有其他更复杂的技术,但它们基本上归结为如何将数据传输到不同的核心。