23

我是一名CS硕士生,下学期我将不得不开始写论文。我在想出论文想法时遇到了麻烦,但我决定将它与计算机图形学相关,因为我对游戏开发充满热情,并希望有一天能成为一名专业的游戏程序员。

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

我对 GPU 编程知之甚少,但我仍在学习着色器和 CUDA 等语言。我的一个想法是在 GPU 上(或尽可能多地)编写整个游戏,包括所有游戏逻辑、AI 和测试。这是通过阅读有关 GPGPU 的论文和类似的问题得到启发的,我不知道这在我的知识范围内有多可行,而且我的主管对最近的 GPU 了解不多我相信随着时间的推移我将能够自己回答这个问题,但如果我能提前知道答案会很方便,这样我也可以考虑其他想法。

所以,如果你已经走到这一步,我的问题是:只使用着色器或类似 CUDA 的东西,你能否制作一个完整、简单的 3D 游戏,利用 GPU 的原始能力和并行性?还是我错过了 GPU 和 CPU 之间的一些限制或差异,这些限制或差异总是会使我的大部分代码绑定到 CPU?我已经阅读了有关在 GPU 上运行的物理引擎的信息,那么为什么不是其他所有内容呢?

4

9 回答 9

18

免责声明:我已经完成了博士学位,但从未指导过我自己的学生,所以请对我要说的所有内容持保留态度!

我认为尝试将尽可能多的游戏强制到 GPU 上是开始您的项目的好方法,但最终您的工作重点应该是:“这件事是许多游戏的重要组成部分,但在它当前状态在 GPU 上不太适合:这是我如何修改它以使其适合“。

例如,fortran 提到 AI 算法是一个问题,因为它们往往依赖于递归。没错,但这并不一定会破坏交易:将递归算法转换为迭代形式的艺术受到学术界的好评,并且会成为你论文的一个很好的核心。

但是,作为一名硕士生,您没有太多时间,因此您确实需要非常快速地识别出感兴趣的内核。作为大师成果的一部分,我不会费心试图让整个游戏真正适合 GPU:我会将其视为一种练习,只是为了看看哪个部分不适合,然后只专注于那个部分。

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

于 2009-11-24T12:18:48.467 回答
5

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

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

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

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

于 2009-11-24T10:43:09.517 回答
3

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

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

6 年前就已经选择了答案,但对于那些对实际问题感兴趣的人来说,实时编码 WebGL 平台 Shadertoy 最近添加了允许保存状态的“多通道”功能。

这是在 Gpu 上运行的 Bricks 游戏的现场演示。

于 2016-02-16T23:10:11.580 回答
2

我不在乎它是否已经完成,对我来说,论文更多的是一个深入了解事物并自己做大量工作的机会。

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

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

如果您查看CUDA 维基百科页面,您会看到:

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

所以忘记在那里实现任何本质上是递归的人工智能算法(比如用于寻路的 A*)。也许您可以使用堆栈来模拟递归,但如果明确不允许它应该是有原因的。没有函数指针也会在一定程度上限制使用调度表来处理取决于游戏状态的不同操作的能力(您可以再次使用链式 if-else 结构,但那里有些东西很难闻)。

语言中的这些限制反映了底层硬件主要被认为是执行流处理任务。当然有一些变通方法(堆栈,链式 if-else),理论上你可以在那里实现几乎任何算法,但它们可能会使性能下降很多。

另一点是关于处理 IO,正如上面已经提到的,这是主 CPU 的任务(因为它是执行操作系统的任务)。

于 2009-11-24T11:20:27.400 回答
2

在开始时不熟悉的主题和工具上完成硕士论文是可行的。但是,这是一个很大的机会!

当然,硕士论文应该很有趣。但最终,你必须以优异的成绩通过考试,这可能意味着要解决你已经掌握的难题。

同样重要的是你的主管。你必须解决他们感兴趣的一些问题——他们自己熟悉——这样他们才能对帮助获得好成绩感兴趣。

你已经有很多时间去挠痒痒了,毫无疑问,你将来也会有更多的爱好时间。但遗憾的是硕士论文时间不是兴趣爱好的时间。

于 2009-11-25T12:27:18.533 回答
1

尽管今天的 GPU 具有强大的计算能力,但它们不受 CUDA 和 OpenCL 等限制用途限制的限制,而 CPU 更适合计算一般事物,具有 SSE 等扩展来加速特定的常见任务。如果我没记错的话,一些 GPU 无法在硬件中进行两个浮点整数的除法。当然,与 5 年前相比,情况有了很大改善。

开发一款完全在 GPU 中运行的游戏是不可能的——它在某个阶段需要 CPU 来执行某些东西,但是让 GPU 执行的不仅仅是游戏的图形(甚至物理)肯定会很有趣,PC 游戏开发者面临的最大问题是必须应对各种机器规格,因此不得不将自己限制为向后兼容,这使事情变得复杂。系统架构将是一个关键问题 - 例如,Playstation 3 能够在 CPU 和 RAM、GPU 和视频 RAM 之间实现每秒数 GB 的吞吐量,但是 CPU 访问 GPU 内存的峰值刚刚超过 12MiB/ s。

于 2009-11-24T10:41:34.203 回答
1

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

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

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

于 2009-11-24T11:01:43.843 回答
1

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

于 2009-11-25T12:17:35.427 回答