问题描述
将所有值存储在我们将用于数学计算的变量中是否重要?或者,如果我将结果/变量直接与浮点数相乘也可以,特别是在每帧执行时。
例如,我必须对我的播放器施加计算的力。以下 2 种方法的最佳优化方法是什么?如何优化?
代码 1:直接相乘
Rigidbody Player;
void Update()
{
Player.AddForce(Vector3.forward * 2.5f * 4.5f * 2);
}
或
Code 2 : Store values in variables and then use
float speed = 2.5f;
float speed_multiplier = 4.5f;
float additional_force = 2;
float resultant_force;
Rigidbody Player;
void Update()
{
resultant_force = speed * force_multiplier * additional_force;
Player.AddForce(Vector3.forward * resultant_force);
}
哪个计算速度更快,而无需缓存额外的内存。从 cpu 计算和内存优化的角度来看,哪个更好?
谢谢。
解决方法
TL;DR;无论哪种方式差异都会很小。
* 2.5f * 4.5f * 2
肯定会被 JIT 或本机编译器 (AOT) 完全内联。
另一方面,将它们保存在变量中更有利于封装和避免幻数。它可能会稍微慢一点,也可能不会,但您实际上只是在谈论几个时钟周期。
这取决于编译器优化的程度。我怀疑如果它们是字段,它可能不会被优化,而局部变量会被内联。
通过使用常量获得两全其美的效果,这些将完全像您的第一个选项一样被内联。
const float speed = 2.5f;
const float speed_multiplier = 4.5f;
const float additional_force = 2;
顺便说一句,float resultant_force;
无论如何都没用,可以删除或制作成局部变量。