GPU是很好的并行任务。如果您正在运行并行任务,那太好了。
游戏是关于最少并行化的应用程序。考虑一下主要的游戏循环。AI(假设玩家被当作AI的特例处理)需要响应物理检测到的碰撞。因此,它必须随后运行。或者至少,物理学需要在物理学系统的边界内调用AI例程(由于许多原因,这通常不是一个好主意)。图形必须等到物理运行后才能运行,因为物理会更新对象的位置。当然,AI也需要在渲染之前运行,因为AI可以生成新对象。在AI和播放器控制之后需要运行声音
一般而言,游戏可以以很少的方式进行线程化。图形可以在线程中分离出来。游戏循环可以在图形线程中推送大量数据,然后说:渲染此数据。它可以进行一些基本的插值,因此主游戏循环不必与图形保持同步。声音是另一个主题。游戏循环中说“播放”,然后播放。
在那之后,这一切开始变得痛苦。如果您具有复杂的路径算法(例如RTS的),则可以对它们进行线程化。算法可能需要花费几帧才能完成,但至少是并发的。除此之外,这非常困难。
因此,您正在研究4个线程:游戏,图形,声音以及可能的长期AI处理。那不多。而这还不是几乎足够的GPU,它可以有数百个线程在飞行一次。这就是使GPU发挥性能的原因:能够立即利用所有这些线程。游戏根本无法做到这一点。
现在,也许您可以进行一些操作。例如,AI通常彼此独立。因此,您可以一次处理数十个AI。直到您真正需要使它们相互依赖为止。那你就麻烦了。物理对象同样是独立的...除非它们之间没有约束和/或它们与某些物体碰撞。然后他们变得非常依赖。
另外,事实是GPU根本无法访问用户输入,据我了解,这对游戏来说很重要。因此必须提供。它也没有直接的文件访问或与操作系统对话的任何真实方法。因此,再次必须提供某种方式来提供此服务。哦,所有这些声音处理?GPU不发出声音。因此,那些必须先回到CPU,然后再到声音芯片。
哦,为GPU编码非常糟糕。很难做到正确,对于一种GPU架构而言,“正确”对另一种GPU架构而言可能是非常非常错误的。而且,这不仅仅是从AMD转向NVIDIA的事情。可以从GeForce 250切换到GeForce450。这是基本架构的变化。而且它很容易使您的代码运行不正常。不允许使用C ++,甚至C。最好的选择是OpenCL,它有点像C,但是没有一些优点。喜欢递归。没错:GPU上没有递归。
调试?哦,我希望您不喜欢IDE的调试功能,因为这些功能肯定不可用。即使您正在使用GDB,也要吻别。您必须诉诸printf
调试...等等,printf
GPU 上没有。因此,您必须写入内存位置,并让您的CPU存根程序将它们读回。
没错:手动调试。祝你好运。
另外,您在C / C ++中使用的那些有用的库吗?也许您更喜欢使用XNA等.NET。管他呢。没关系,因为您不能在GPU上使用它们中的任何一个。您必须从头开始编写所有代码。而且,如果您已经有一个代码库,那就很难了:该重写所有代码了。
是的。实际上为任何复杂类型的游戏做的事情都是可怕的。而且它甚至都行不通,因为游戏的并行性不足以提供帮助。