将 bool 设置为 false VS 在设置之前检查它是否已经为 false



我知道这可能是过度优化,但我仍然想知道什么更好。

所以让我们添加一些上下文我正在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方法一次,让它一直工作到完成。

相关内容

最新更新