0

我有一个粒子生命周期的属性(我正在模拟粒子系统),它是一个浮点值,因为我也将它用于透明度(alpha 是浮点数)。我已经阅读了有关将 float 转换为 double 的问题,并意识到这是一个很大的问题,所以我可能无法将 float 转换为 double。问题是我想尝试从生命变量计算粒子的路径,例如:

particle.x += particle.xi;
particle.xi = Math.Sin(life);

注意:生命值在开始时为 1.0f 并减少到 0(如果它 <0.0f 我重新初始化粒子并将生命设置为 1.0f)。
但是Sin想要双倍的价值……我们又回到了起点。因此,一种解决方案可以将 life 属性的类型更改为 double ,当我将其用于透明度时,我只会将此 double 转换为 float,这应该不是什么大问题(我猜)。
但我的问题是是否有任何其他方法可以做到这一点,导致双倍也消耗更多内存(我不知道在这种情况下更多意味着什么 - 我想更多倍,假设我将有 500 个粒子,每个粒子都会有这个属性)。我只需要以某种方式从这个浮点属性计算 sin 值。

那么有可能吗?我对记忆的担忧重要吗?

4

1 回答 1

3

这应该有效:

particle.x += particle.xi; 
particle.xi = (float) Math.Sin(life); 

它不会“使用更多内存”,它只是在重新计算时将值临时转换为双精度值,然后在存储值时将其转换回浮点数。

更详细一点:Math.Sin 需要一个 double,但是 float 可以转换为这个更高的精度而不会丢失,所以它只是“神奇地工作”(从 float 到 double的隐式转换)。但是,要将生成的双精度数转换回浮点数,您将降低数字的精度,因此编译器(它不知道您是否可以接受)不会这样做,除非您强制它(通过使用(float)which 是从 double 到 float的显式转换)。

于 2012-05-30T23:18:16.627 回答