我是否应该预先计算 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 缓冲区数据。这应该足以避免重大的性能损失。