纳金网

标题: 对协同程序的yield return的理解 [打印本页]

作者: 刀锋狼    时间: 2014-4-30 02:33
标题: 对协同程序的yield return的理解
最近学习跑酷游戏,遇到协同程序的yield用法,不太理解,于是做了个小例子,看看它到底怎么运行的。以下是个人理解的东西,如果有错误,恳请大神们一定要指出来,别让我自以为正确的一路错下去。好了,直接入正题。

首先把我写的测试代码copy出来,把这个.cs文件挂到一游戏对象上:
private int j = 0;
private int sum = 0;

        // Use this for initialization
        void Start () {

        }

        // Update is called once per frame
        void Update () {
                j++;
                Debug.Log ("开始-- FPS--第"+j+"帧--Start--"+Time.deltaTime);
                StartCoroutine ("ifbs");
                sum = j * j;
                Debug.Log (sum);

        }

        IEnumerator ifbs() {
                Debug.Log ("Start 调用迭代函数FPS--"+j+"--Start");
                if(j < 4) {
                        for(int i = 0; i < 3; i++) {
                                Debug.Log("FPS--第"+j+"帧中--this is for第--"+i+"--循环");
                                if(i == 1) {
                                        yield return new WaitForSeconds(0.05f);
                                }
                        }
                        Debug.Log ("结束-- FPS--第"+j+"帧--End");
                }
                Debug.Log ("#####到底在哪里停######"+j+"");
        }


然后再建个.cs文件挂到另一游戏对象上,代码如下:
private int i = 0;

        // Use this for initialization
        void Start () {

        }

        // Update is called once per frame
        void Update () {
                i++;
                Debug.Log ("立方体这是YieldR文件的Update方法--"+i);
        }


然后运行,log文件是这样的,拷取了log文件部分,做了精简,大家可以自己试试:

开始-- FPS--第1帧--Start--0.02

Start 调用迭代函数FPS--1--Start

FPS--第1帧中--this is for第--0--循环

FPS--第1帧中--this is for第--1--循环

1

立方体这是YieldR文件的Update方法--1

开始-- FPS--第2帧--Start--0.02

Start 调用迭代函数FPS--2--Start

FPS--第2帧中--this is for第--0--循环

FPS--第2帧中--this is for第--1--循环

4

立方体这是YieldR文件的Update方法--2

开始-- FPS--第3帧--Start--0.1288795

Start 调用迭代函数FPS--3--Start

FPS--第3帧中--this is for第--0--循环

FPS--第3帧中--this is for第--1--循环

9

立方体这是YieldR文件的Update方法--3

FPS--第3帧中--this is for第--2--循环

结束-- FPS--第3帧--End

#####到底在哪里听######3

FPS--第3帧中--this is for第--2--循环

结束-- FPS--第3帧--End

#####到底在哪里听######3

开始-- FPS--第4帧--Start--0.05303032


因为要等0.05秒,所以第一帧和第二帧不会运行yield后面的内容,直到第三帧时,时间过去了0.05秒,就会在第三帧的时候运行yield后面的内容,到这里就有疑问了,那这个yield后面的内容是在update方法一开始就运行,还是调用StartCoroutine启动协同程序的时候调用,可是结果让我很困惑,直到看到雨凇momo的
帖子:深入理解unity脚本的执行顺序
知道了unity的运行机制,就好像明白了什么。
首先是所有update方法先都运行完才运行yield后面的内容,就像有个update总管把所有的这一帧的update方法集合起来先搞定这一帧所有update方法,然后把所有的欠下的yield后面的内容执行掉,就接着运行下一帧。

还发现了StartCoroutine ("ifbs")和StartCoroutine (ifbs())运行结果一样,不知道有什么区别,还有yield return 0和yield return 2的运行结果没看出来区别,望大神解答。



作者: hyui    时间: 2014-4-30 03:49
good share!
作者: xizhenlong    时间: 2014-7-17 21:12
yield return 0是立即执行,2是等2帧执行
作者: askaking    时间: 2014-7-17 23:21
楼上说的不对哦,yield return null都可以,只是为了通知协程管理器,我到这个点要中断一下,下一帧从这个地方运行而已
作者: wa5145416    时间: 2014-8-15 17:23
挺厉害的。。
作者: soulvision    时间: 2017-2-15 11:53

yield return null
yield return 0 或者
yield return 1或者10000都是一样的,只是为了返回,等一帧后继续。
作者: jdxz9933    时间: 2017-2-17 16:08
Unity 用迭代器做的携程,可以理解为主线程等待,当满足某个条件的时候,返回一个yield return,并执行后面的代码,直到下一个 yield return或者代码结束。




欢迎光临 纳金网 (http://c-www.narkii.com/club/) Powered by Discuz! X2.5