【问题标题】:WaitForEndOfFrame is called twice at first runWaitForEndOfFrame 在第一次运行时被调用两次
【发布时间】: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 作为参数传递来测试它,以便在同一例程中拥有相同的。第一帧被延迟到第二帧......之后它按预期工作。他们还认为这是一个错误 .. 显然是一个从未修复过的错误 ;)

标签: unity3d yield


【解决方案1】:

我会说它没有被调用两次,但实际情况是在第一帧开始的第一个协程一直持续到第二帧中 frameCount 已经是 2


这似乎是与WaitForEndOfFrame 和应用程序的第一帧相关的 Unity BUG

参见例如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 的一个小问题并忽略它;)

【讨论】:

  • 是的,这很可能是正在发生的事情。第一帧有几个奇怪的地方,因为很多系统都在热身。您还会得到 deltaTime 的不可靠值。尽管您通常不会在第一帧中依赖它们。 AFAIK 第一帧甚至没有正确渲染。所以第一帧应该被视为一个热身周期。
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2017-01-19
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多