我知道这可能是过度优化,但我仍然想知道什么更好。
所以让我们添加一些上下文我正在Unity上开发一款游戏,它使用C#编写游戏脚本,Unity制作的一些方法可以在游戏的每一帧中运行。对于我正在开发的游戏,我在代码中使用触发器。它们是以false开头的简单布尔值。当游戏中发生特定事件时,特定触发器将设置为true,将立即激活事件,并再次设置为false。这一切都发生在一帧中。
因此,这意味着在每帧结束时,我必须将触发器重置为false这就是我的疑虑所在。我应该将所有触发器都设置为false,而不考虑它们的当前值,还是应该添加一个IF条件来检查它们是否已经为false?
一般来说,我建议你在设置布尔值之前先检查它。我没有任何数据表明哪个更具性能,但它有功能优势。如果您使用的是字段,则检查和设置布尔值没有任何副作用。然而,如果您使用的是一个属性,getter和setter可能会产生一些副作用,如果您在每帧中都设置它们,则会导致不必要的行为。如果你只是使用布尔值,那么它并不总是立即清楚你是在处理字段还是属性。
我建议您不要在Update
方法中使用标志布尔值。Update
方法应该只执行在对象处于活动状态时必须执行的操作。我假设你有一些代码,如果发生了什么事情,就会设置标志,在你的Update
方法中,你会做一些事情,直到满足另一个条件,然后重置标志。
// This is my flag variable.
public bool isCounting;
public int maximum;
private int _currentCount;
private void Update()
{
if (IsConditionMet()) {
// Should I check if isCounting is already false before setting?
isCounting = false;
}
if (isCounting) {
DoWork();
}
else
{
return;
}
}
private bool IsConditionMet()
{
return _currentCount >= maximum;
}
private void DoWork()
{
_currentCount++;
}
当其他代码将标志isCounting
设置为true
时,_currentCount
将增加,直到达到最大值并停止计数。当计数开始时正好有一帧,当计数停止时刚好有一帧。在所有其他帧期间,Update
方法检查标志变量,不执行任何其他操作。
相反,您可以使用协程和调用方法:
public void StartCounting()
{
StartCoroutine(Count());
}
private IEnumerable Count()
{
while (!IsConditionMet())
{
DoWork();
yield new WaitForSeconds(1);
}
}
这段代码公开了一个名为StartCounting
的公共方法。要开始计数,请调用StartCounting
,而不是设置公共字段isCounting
。然后,该方法启动一个在Update
代码之外执行的协同程序。协同程序Count
检查条件是否满足,如果不满足则继续工作。当它完成工作时,协程会等待一秒钟并再次尝试,直到_currentCount
到达maximum
。这样,您就不必担心检查和设置标志值,而是只调用StartCounting
方法一次,让它一直工作到完成。