最近,我花了很多时间研究GPU的主题,并且发现了几篇文章,讨论PC游戏如何与控制台游戏相比,由于受到限制而难以保持领先地位。蜜蜂。例如,在Xbox 360上,我理解游戏是在内核模式下运行的,并且因为硬件总是相同的,所以游戏可以编程为“更接近金属”而Directx api的抽象更少。然而,在PC上,由于切换到内核模式和更多抽象层,使用Direct-X或Opengl进行相同数量的绘制调用可能比在控制台上花费的时间多2倍。我有兴趣听到这个问题的可能解决方案。
我听说过一些解决方案,比如直接在硬件上进行编程,但是虽然(据我所知),ATI已经发布了低级别API的规格,nVidia保密,所以不行太好了,更不用说制作不同档案的额外开发时间了。
在Opencl中编写整个“软件渲染”解决方案并在GPU上运行它会更好吗?我的理解是,有大量绘制调用的游戏是cpu绑定的,调用是单线程的(在PC上),Opencl是一个可行的选择吗?
所以问题是: 有哪些方法可以提高效率,甚至不再需要图形API,如Opengl和Directx?
答案 0 :(得分:3)
一般的解决方案是不要绘制尽可能多的绘制调用。纹理地图集通过数组纹理,实例化和各种其他技术使这成为可能。
或者只是使用现代计算机比控制台具有更多CPU性能的事实。或者甚至更好,让自己受到GPU限制。毕竟,如果您的CPU是您的瓶颈,那么这意味着您拥有GPU备用电源。使用它。
OpenCL不是与此相关的任何“解决方案”。 OpenCL无法访问实际使用GPU进行渲染所需的许多事情。为了将OpenCL用于图形,你不得不使用GPU的光栅化器/限幅器,它是用于从一级到另一级传输信息的专用缓冲器,后T& L高速缓存或混合/深度比较/模板/等硬件。所有这一切都是固定功能,非常快速和专业。并且OpenCL完全无法使用。
即便如此,它实际上并不会使它不再受CPU限制。你仍然需要编组你正在渲染的内容等等。您可能无法访问图形FIFO,因此您必须找到另一种方式来为着色器提供信息。
或者,换句话说,这是一个不需要解决的“问题”。
答案 1 :(得分:0)
如果您尝试在OpenCL中编写渲染器,最终会得到类似OpenGL和DirectX的东西。您很可能最终会得到比许多专家多年来开发的这些API慢得多的东西。它们专门用于处理高效的光栅化并使用OpenCL无法使用的内部挂钩。这可能是一个有趣的项目,但绝对不是一个有用的项目。
Nicol Bolas已经为您提供了一些很好的技术来增加GPU相对于CPU的负载。最后的答案当然是最好的技术将取决于您的特定领域和约束。例如,如果渲染需要使用复杂着色器和大量纹理来调用大量像素过度绘制,则CPU不会成为瓶颈。但是,现代硬件最重要的一般规则是通过更好的批处理来限制OpenGL调用的次数。
答案 2 :(得分:0)
的API。例如,在Xbox 360上,我理解游戏是在内核模式下运行的,并且因为硬件总是相同的,所以游戏可以编程为“更接近金属”而Directx api的抽象更少。然而,在PC上,由于切换到内核模式和更多抽象层,使用Direct-X或Opengl进行相同数量的绘制调用可能会花费2倍于控制台的时间。
通过更大的CPU性能和可用内存,PC上接近金属操作的好处在很大程度上得到了补偿。除此之外,游戏机的硬盘并不像现代PC(SATA-1与SATA-3,甚至只是PATA)一样快,许多游戏从光驱中获取内容甚至更慢。
例如,PS3 360仅为游戏逻辑提供256MiB内存,为图形提供另外256MiB RAM以及更多无法使用的内存。 X-Box 360提供512MiB的统一内存,因此您必须挤压它。现在将它与低端PC进行比较,它可以轻松地为程序单独提供2GiB的RAM。即使是最便宜的显卡也能提供至少512MiB的RAM。游戏玩家机器将拥有几个GiB的RAM,GPU将提供1GiB到2GiB之间的东西。这极大地限制了游戏开发者的可能性,并且许多PC游戏玩家都在哀悼许多游戏都“沉闷”,但他们的PC可以做得更多。