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 BUGWaitForEndOfFrame 和应用程序的第一帧有关!

参见例如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 在您的应用程序初始化过程中出现的小问题,并忽略它 ;)