当前位置:   article > 正文

Unity中yield return null和yield return WaitForEndOfFrame的区别_unity yield return null

unity yield return null

Unity中yield return null和yield return WaitForEndOfFrame的区别

https://blog.csdn.net/sarah_shao/article/details/93886615

测试结论:

1.如果只是等待下一帧执行,用yield return null即可。调用顺序在Update后,LateUpdate前

2.如果有截屏需要,用WaitForEndOfFrame。具体参考官方例子。否则直接用Texture2D.ReadPixel抓取屏幕信息则会报错。

3.此外,用WaitForEndOfFrame还可以让代码在LateUpdate的时序后调用。

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4. public class Test1 : MonoBehaviour
  5. {
  6. void OnEnable()
  7. {
  8. StartCoroutine(ReturnNullTest());
  9. StartCoroutine(ReturnWaitForEndOfFrame());
  10. }
  11. IEnumerator ReturnNullTest()
  12. {
  13. Debug.Log("[1] ReturnNull Frame Count: " + Time.frameCount + "Render Frame Count: " + Time.renderedFrameCount);
  14. yield return null;
  15. Debug.Log("[2] ReturnNull Frame Count: " + Time.frameCount + "Render Frame Count: " + Time.renderedFrameCount);
  16. }
  17. IEnumerator ReturnWaitForEndOfFrame()
  18. {
  19. Debug.Log("[1] WaitForEndOfFrame Frame Count: " + Time.frameCount + "Render Frame Count: " + Time.renderedFrameCount);
  20. yield return new WaitForEndOfFrame();
  21. Debug.Log("[2] WaitForEndOfFrame Frame Count: " + Time.frameCount + "Render Frame Count: " + Time.renderedFrameCount);
  22. }
  23. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

从测试顺序来看,两者都可以达到下一帧执行的目的

但WaitForEndOfFrame的渲染帧会多跳一帧
在这里插入图片描述测试2:

先看一下官方的执行顺序表
在这里插入图片描述WaitForEndOfFrame会在一帧结束后调用,且在LateUpdate之后调用。

而正常yield return null的调用是在update之后,也就是说可以分别做到不同时序的调用。

  1. public class Test : MonoBehaviour
  2. {
  3. void Awake()
  4. {
  5. Debug.Log("0");
  6. StartCoroutine(TestCoroutine());
  7. Debug.Log("2");
  8. }
  9. void Update()
  10. {
  11. Debug.Log("3 - Update");
  12. }
  13. void LateUpdate()
  14. {
  15. Debug.Log("4 - LateUpdate");
  16. }
  17. IEnumerator TestCoroutine()
  18. {
  19. Debug.Log("1");
  20. yield return new WaitForEndOfFrame();
  21. Debug.Log("5");
  22. }
  23. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

结果:
在这里插入图片描述不过对于静态置于场景中调用时,会多经过一次Update和LateUpdate

起初以为是第0帧问题,但后来放在Start中执行依旧会多经过一次。

但动态加载的prefab则没有该问题。

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/95651
推荐阅读
相关标签
  

闽ICP备14008679号