Unity3d WaitForEndOfFrame在第一次运行时被调用两次

Unity3d WaitForEndOfFrame在第一次运行时被调用两次,unity3d,yield,Unity3d,Yield,我试图理解WaitForEndOffFrame,几乎已经明白了,但问题是当遇到第一个yield时,它会跳过并保存到下一帧,在下一帧中,它会在渲染结束时恢复,但会调用两次,并且在其余帧中继续按预期工作。 无法找出为什么在第二帧中调用了两次yield之后的预期代码 void Update() { print("1 - " + Time.frameCount); StartCoroutine(Enu()); print("3 - " +

我试图理解WaitForEndOffFrame,几乎已经明白了,但问题是当遇到第一个
yield
时,它会跳过并保存到下一帧,在下一帧中,它会在渲染结束时恢复,但会调用两次,并且在其余帧中继续按预期工作。 无法找出为什么在第二帧中调用了两次
yield
之后的预期代码

void Update()
{
    print("1 - " + Time.frameCount);
    StartCoroutine(Enu());
    print("3 - " + Time.frameCount);
}

IEnumerator Enu()
{
    print("2 - " + Time.frameCount);
    yield return new WaitForEndOfFrame();
    print("4 - " + Time.frameCount);
}
1-1

2-1

3-1

--

1-2

2-2

3-2

4-2


4-2我想说它没有被调用两次,但是所发生的事情是,在第一帧中开始的第一个协程一直持续到第二帧中,
frameCount
已经是
2


这似乎是一个与应用程序的第一个框架相关的UnityBUG

见例

当他们遇到完全相同的问题时,只需将当前的
frameCount
作为参数传递到例程中,以更好地测试它,这样他们就知道它实际上是为哪一帧继续的:

公共类WaitForEndTest:MonoBehavior
{      
私有无效更新()
{  
Log(“更新:+Time.frameCount”);
startcroutine(waitForEndOfframeCroutine(Time.frameCount));
}
私有IEnumerator WaitForEndOfframeCroutine(int frameCount)
{
Log(“在帧结束之前:+frameCount”);
返回新的WaitForEndOfFrame();
Log(“帧结束后:+frameCount”);
}
}
也适用于与您的箱子相似的印刷品


在应用程序初始化过程中,您应该将其视为一个小小的团结问题,并忽略它;)

我想说,它没有被调用两次,但实际情况是,在第一帧中启动的第一个协同路由将一直持续到第二帧中,
frameCount
已经是
2


这似乎是一个与应用程序的第一个框架相关的UnityBUG

见例

当他们遇到完全相同的问题时,只需将当前的
frameCount
作为参数传递到例程中,以更好地测试它,这样他们就知道它实际上是为哪一帧继续的:

公共类WaitForEndTest:MonoBehavior
{      
私有无效更新()
{  
Log(“更新:+Time.frameCount”);
startcroutine(waitForEndOfframeCroutine(Time.frameCount));
}
私有IEnumerator WaitForEndOfframeCroutine(int frameCount)
{
Log(“在帧结束之前:+frameCount”);
返回新的WaitForEndOfFrame();
Log(“帧结束后:+frameCount”);
}
}
也适用于与您的箱子相似的印刷品


在应用程序初始化过程中,您应该将其视为一个小小的团结问题,并忽略它;)

不,它不是真的叫两次。。。其中一个是从第一帧还没有打印出来的延迟帧。。不是100%确定,但第一帧似乎会延迟到下一帧。。似乎是一个边缘情况是的,所有这些都是从上一帧延迟的,但是从第一帧延迟的一个调用了两次,您可以测试它。最后一个答案中的这个人也有同样的问题,我不认为他们都延迟了一帧。。只有第一个在第二帧中继续,其中帧数已经
2
。。。通过将
frameCount
作为参数传递到例程中,并让它打印参数,以便查看它在哪一帧继续,可以更好地检查这一点。。目前在我的手机上,因此无法自行测试帧数打印为上面显示的列表结果中的第二个数字,因为您可以看到,第4帧的帧数2打印了两次,这是第一帧的延迟代码,因此当它位于第2帧时,打印(“4-”+Time.frameCount);被称为twiceCheckout,但他们正好遇到了您的问题,他们只是测试了它,正如我所说的,通过传入frameCount作为参数,以便在同一个例程中拥有相同的一个。第一帧延迟到第二帧。。在那之后,它就如预期的那样工作了。他们还认为这是一个bug。。显然是一个从未被修复过的;)不,它不是真的叫两次。。。其中一个是从第一帧还没有打印出来的延迟帧。。不是100%确定,但第一帧似乎会延迟到下一帧。。似乎是一个边缘情况是的,所有这些都是从上一帧延迟的,但是从第一帧延迟的一个调用了两次,您可以测试它。最后一个答案中的这个人也有同样的问题,我不认为他们都延迟了一帧。。只有第一个在第二帧中继续,其中帧数已经
2
。。。通过将
frameCount
作为参数传递到例程中,并让它打印参数,以便查看它在哪一帧继续,可以更好地检查这一点。。目前在我的手机上,因此无法自行测试帧数打印为上面显示的列表结果中的第二个数字,因为您可以看到,第4帧的帧数2打印了两次,这是第一帧的延迟代码,因此当它位于第2帧时,打印(“4-”+Time.frameCount);被称为twiceCheckout,但他们正好遇到了您的问题,他们只是测试了它,正如我所说的,通过传入frameCount作为参数,以便在同一个例程中拥有相同的一个。第一帧延迟到第二帧。。在那之后,它就如预期的那样工作了。他们还认为这是一个bug。。显然是一个从未被修复过的;)是的,这很可能就是正在发生的事情。第一帧有几个奇怪之处,因为许多系统正在预热。尤艾尔
Update: 1
Before end of frame: 1
Update: 2
Before end of frame: 2
After end of frame: 1
After end of frame: 2