2

好的,所以我只是想找出减少 GPU 和 CPU 之间带宽的最佳方法。

粒子系统。

我是否应该预先计算 CPU 上的大部分内容并将其发送到 GPU,这包括位置、旋转、速度、alpha 计算和随机数等内容。

或者我应该在着色器中尽可能多地使用几何着色器。

我的问题是,我编写的那种应用程序必须将一些变量发送到着色器,例如,运行时的用户将选择发射器位置和速度以及更多。我不确定如何解决的事情是“如果用户想要一个随机速度并给出一个最小值和最大值来选择随机值,这个随机值是否应该在 CPU 上计算并发送作为 GPU 的单个值,还是应该将最小值和最大值都发送到 GPU 并在 GPU 中使用随机函数生成器来执行此操作?非常感谢有关减少带宽和优化的任何评论。

4

2 回答 2

3

我是否应该预先计算 CPU 上的大部分内容并将其发送到 GPU,这包括位置、旋转、速度、alpha 计算和随机数等内容。

或者我应该在着色器中尽可能多地使用几何着色器。

无法回答。花费过多的 CPU 时间,性能会下降。花费过多的 GPU 时间,性能也会下降。传输太多数据,性能会下降。所以,不要试图猜测(我不知道你在写什么应用程序,你的目标硬件是什么等等。地狱,你甚至没有指定你的目标 api 和平台)测量/配置文件并选择最佳方法。PROFILE而不是试图猜测性能。有 AQTime 7 Standard、gprof 和NVPerfKit(以及许多其他工具)。

您的应用程序中是否真的存在性能问题?如果你没有任何性能问题,那么不要做任何事情。你有,比如说每帧一千万个粒子吗?如果没有,也没什么理由担心,因为 7 年前 600mhz cpu 能够轻松处理数千个。另一方面,如果你有动态 3d 环境,并且粒子必须与之交互(反弹),那么在 GPU 上完成这一切将更加困难。

无论如何,对我来说,听起来你不需要优化任何东西,也没有实际需要优化。所以最好的办法是专注于其他一些事情。

但是,无论如何,请确保您使用正确的方式来传输经常更新的“动态”数据。在 directX 中,这意味着使用带有 D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE 的动态只写顶点缓冲区。对于 OpenGL,这可能意味着使用具有 DRAW 访问权限的 STREAM 或 DYNAMIC 缓冲区数据。这应该足以避免重大的性能损失。

于 2012-05-09T01:56:21.550 回答
2

对此没有唯一的正确答案。以下是一些可以帮助您下​​定决心的事情:

  1. 您确定通过总线的数据量高到足以成为问题吗?您可能想要进行数学计算,看看每秒有多少数据与目标硬件上可用的数据。
  2. 应用程序是否可能受 CPU 限制或 GPU 限制?如果它已经受 GPU 限制,那么进一步加载它是没有意义的。
  3. 粒子系统很容易在 CPU 上实现,并且可以在任何硬件上运行。支持非平凡粒子系统的 GPU 实现将更加复杂,并且仅限于支持所需功能的硬件(例如流输出和提供访问它的 API)。
  4. 考虑一种混合方法。您能否将粒子系统拆分为在 GPU 上实现的低复杂度、高带宽粒子系统和在 CPU 上实现的高复杂度、低带宽系统?

综上所述,我想我会从一个 CPU 实现开始,如果证明有必要和可行的话,我会将一些工作转移到 GPU 上。

于 2012-05-09T01:43:38.123 回答