【发布时间】:2021-03-04 15:43:52
【问题描述】:
我试图理解 WaitForEndOfFrame 并且几乎想通了,但问题是当遇到第一个 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
--
1 - 3
2 - 3
3 - 3
4 - 3
--
1 - 4
2 - 4
3 - 4
4 - 4
--
1 - 5
2 - 5
3 - 5
4 - 5
【问题讨论】:
-
不,它并没有真正被调用两次......其中一个是从第一帧开始延迟的一个,它还没有被打印出来......不是 100% 确定,但似乎是第一个帧被延迟到下一个.. 似乎是一个边缘情况
-
是的,都是从上一帧延迟的,但是从第一帧延迟的那一个被调用了两次,你可以测试一下。上一个答案的这个人有同样的问题answers.unity.com/questions/755196/…
-
我不认为它们都被延迟了一帧.. 只有第一个在 frameCount 已经是
2的第二帧中继续......你可以通过传递更好地检查出来frameCount作为您的例程中的参数并让它打印参数以查看它在哪一帧继续.. 目前在我的手机上,所以无法自己测试 -
frameCount 打印为上面显示的列表结果中的第二个数字,如您所见,对于数字 4,frameCount 2 打印了两次,这是第一帧的延迟代码,所以当它的在第 2 帧, print("4 - " + Time.frameCount);被调用两次
-
Checkout this post (The second from the bottom from Dantus) 他们完全遇到了您的问题,他们只是按照我所说的通过将 frameCount 作为参数传递来测试它,以便在同一例程中拥有相同的。第一帧被延迟到第二帧......之后它按预期工作。他们还认为这是一个错误 .. 显然是一个从未修复过的错误 ;)