我有一个粒子生命周期的属性(我正在模拟粒子系统),这是一个浮点值,因为我也将它用于透明度(alpha是浮点数)。我已经读过有关将float转换为double的问题,并意识到这是一个很大的问题,所以我可能无法将float转换为double。问题是我想尝试从生命变量中计算粒子的路径,如:
particle.x += particle.xi;
particle.xi = Math.Sin(life);
注意:寿命值在1.0f开始并且减小到0(如果它< 0.0f我重新初始化粒子并将寿命设置为1.0f)。
但罪恶想要双重价值......我们又回到了开始阶段。
因此,一个解决方案可以将生命属性的类型更改为double,当我将其用于透明度时,我将只将此双转换为float,这应该不是大问题(我猜)。
但我的问题是,是否有任何其他方法可以做到这一点,因为双倍也会花费更多的内存(我不知道在这种情况下还有什么意思 - 我想更多时间,让我说我将有500个粒子,每个都会有这个属性)。 我只需要以某种方式从这个浮动属性中计算sin值。
有可能吗?我对记忆的担忧是否重要?
答案 0 :(得分:3)
这应该有效:
particle.x += particle.xi;
particle.xi = (float) Math.Sin(life);
它没有“使用更多内存”,它只是在重新计算时暂时将值转换为double,然后在存储值时将其转换回float。
进一步详细说明:Math.Sin需要一个double,但是float可以转换为更高的精度而不会丢失,所以它只是“神奇地工作”(隐式强制转换从浮动到双倍)。但是,要将生成的double转换回float,您将降低数字的精度,因此编译器(不知道您是否可以接受)将不会执行此操作,除非您强制执行(使用(float)
这是一个显式强制转换为double to float)。