好的,所以我只是试图找出减少GPU和CPU之间带宽的最佳方法。
粒子系统。
我是否应该预先计算CPU上的大部分内容并将其发送到GPU,这包括位置,旋转,速度,alpha和随机数等的计算。
或者我应该尽可能多地在着色器中尽可能多地使用几何着色器。
我的问题是,我编写的那种应用程序必须将很少的变量发送到着色器,例如,用户在运行时将选择发射器位置和速度加上更多。我不确定如何处理的各种事情是“如果用户想要随机速度并给出最小值和最大值以从中选择随机值,那么这个随机值是否应在CPU上计算并发送作为GPU的单个值,还是应该将最小值和最大值都发送到GPU并在GPU中使用随机函数发生器呢?对减少带宽和优化的任何评论都非常感激。
答案 0 :(得分:3)
我是否应该预先计算CPU上的大部分内容并将其发送到GPU,这包括位置,旋转,速度,alpha和随机数等的计算。
或者我应该尽可能多地在着色器中尽可能多地使用几何着色器。
无法回答。花费太多的CPU时间和性能会下降。花费太多GPU时间,性能也会下降。传输过多数据,性能会下降。所以,而不是试图猜测(我不知道你正在写什么应用程序,你的目标硬件是什么,等等,你甚至没有指定你的目标api和平台)测量/配置文件并选择最佳方法。 PROFILE ,而不是试图猜测性能。有AQTime 7 Standard,gprof和NVPerfKit(以及许多其他工具)。
您的应用程序中确实存在性能问题吗?如果您没有任何性能问题,请不要做任何事情。你有,实际上每帧有一千万个粒子吗?如果没有,没有什么可担心的,因为一个600mhz的cpu能够在7年前轻松处理数千个cpu。另一方面,如果你有动态3d环境,粒子必须与它互动(反弹),那么在GPU上完成这一切将会更加困难。
无论如何,对我而言,听起来你不需要优化任何东西,并且没有实际需要进行优化。因此,最好的想法是专注于其他一些事情。
但是,无论如何,请确保您使用正确的方式传输经常更新的“动态”数据。在directX中,这意味着使用带有D3DLOCK_DISCARD | D3DLOCK_NOOVERVERRRITE的动态只写顶点缓冲区。使用OpenGL可能意味着使用STREAM or DYNAMIC bufferdata with DRAW access。这应该足以避免重大的性能下降。
答案 1 :(得分:2)
对此没有一个正确的答案。以下是一些可能有助于您下定决心的事情:
所有这一切,我想我会从CPU实现开始,如果证明有必要和可行的话,将部分工作转移到GPU上。