WaitForEndOfFrame 首先被调用两次 运行
WaitForEndOfFrame is called twice at first run
我试图理解 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
我会说它没有被调用两次,而是发生的情况是,在第一帧中启动的第一个协程一直持续到第二帧中 frameCount
已经是 2
。
这似乎是一个 Unity BUG 与 WaitForEndOfFrame
和应用程序的第一帧有关!
参见例如this post (The second from the bottom from Dantus)
他们遇到了完全相同的问题,只是通过将当前 frameCount
作为参数传递到例程中来更好地测试它,这样他们就知道它实际上是针对哪个帧继续的:
public class WaitForEndTest : MonoBehaviour
{
private void Update ()
{
Debug.Log ("Update: " + Time.frameCount);
StartCoroutine (WaitForEndOfFrameCoroutine (Time.frameCount));
}
private IEnumerator WaitForEndOfFrameCoroutine (int frameCount)
{
Debug.Log ("Before end of frame: " + frameCount);
yield return new WaitForEndOfFrame ();
Debug.Log ("After end of frame: " + frameCount);
}
}
他们打印的也与您的情况类似
Update: 1
Before end of frame: 1
Update: 2
Before end of frame: 2
After end of frame: 1
After end of frame: 2
您应该将其视为 Unity 在您的应用程序初始化过程中出现的小问题,并忽略它 ;)
我试图理解 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
我会说它没有被调用两次,而是发生的情况是,在第一帧中启动的第一个协程一直持续到第二帧中 frameCount
已经是 2
。
这似乎是一个 Unity BUG 与 WaitForEndOfFrame
和应用程序的第一帧有关!
参见例如this post (The second from the bottom from Dantus)
他们遇到了完全相同的问题,只是通过将当前 frameCount
作为参数传递到例程中来更好地测试它,这样他们就知道它实际上是针对哪个帧继续的:
public class WaitForEndTest : MonoBehaviour { private void Update () { Debug.Log ("Update: " + Time.frameCount); StartCoroutine (WaitForEndOfFrameCoroutine (Time.frameCount)); } private IEnumerator WaitForEndOfFrameCoroutine (int frameCount) { Debug.Log ("Before end of frame: " + frameCount); yield return new WaitForEndOfFrame (); Debug.Log ("After end of frame: " + frameCount); } }
他们打印的也与您的情况类似
Update: 1 Before end of frame: 1 Update: 2 Before end of frame: 2 After end of frame: 1 After end of frame: 2
您应该将其视为 Unity 在您的应用程序初始化过程中出现的小问题,并忽略它 ;)