协程统一-不可预测的行为

问题描述 投票:-1回答:1

任何人都可以解释我的代码的问题吗?

我在程序开始时启动了两个协程。这些是:

loader = StartCoroutine(loadobjectsfromfile);
buffer = StartCoroutine(setBufferToSpesificLocation(0));

简要说明loadobjectsfromfile从文件读取obj并将它们添加到List<GameObjects> loadedObject。蚂蚁它会读取更多信息,直到缓冲区已满。

 IEnumerator loadobjectsfromfile(string filepath, List<GameObject> objs)
    {       while(...)
            {
                // other code lines
               // ...
                loadedObject.Add(gam);
                while (full_)
                {
                    yield return null;
                }  
                k++;
                yield return null;
            } }

setBufferTheSpesificLocation将列表中的对象添加到buffer []数组。并且它还会放置对象,直到缓冲区已满。

 IEnumerator setBufferToSpesificLocation(int startPoint)
    {

        for ( foo = startPoint; foo < loadedObject.Count; foo++)
        {

            while (full_)
            {
                yield return null;
            }

            put(loadedObject[foo]);

            yield return null;
        }

    }

 void put(GameObject frame)
    {

        buff_[head_] = frame;
        head_ = (head_ + 1) % bufferSize;
        full_ = head_ == tail_;


    }

最后一部分,我们如何清空缓冲区?我称其他显示器调用的协程。

IEnumerator displayMesh(GameObject[] objs)
    {


        while (!empty())
        {
            // other lines
            full_ = false; // have a free space
        }

    }

好吧,如果我先启动两个协程,然后再调用最后一个协程(没有问题。我的代码运行良好。但是我遇到了新案例的问题。

loader = StartCoroutine(loadobjectsfromfile);
buffer = StartCoroutine(setBufferToSpesificLocation(0));
StopCoroutine(buffer);
buffer = StartCoroutine(setBufferToSpesificLocation(50)); // 
play = StartCoroutine(displayMesh(buff_));

问题是,在调用第二个缓冲区协程后,加载程序在这种情况下不起作用。当“ ( foo = startPoint; foo < loadedObject.Count; foo++)”结束时,表明加载程序正在工作。

我不明白。我认为,如果full_为false,则加载程序和缓冲区都必须工作,但只有缓冲区正在工作,并且加载程序正在等待“ buffer for {}循环”

unity3d coroutine
1个回答
1
投票

我不知道您为什么要启动协程然后立即将其停止。当您调用StartCoroutine时,它将运行例程,直到达到收益为止。将例程运行到第一个产量后,它将在启动协程的下一行运行。

检查有关事件功能执行顺序的链接:https://docs.unity3d.com/Manual/ExecutionOrder.html#Coroutines

和这有关协程https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity3.html

因此,在您的情况下,事情将按此顺序发生:

1:StartCoroutine

loader = StartCoroutine(loadobjectsfromfile);

2:达到第一个产量

 IEnumerator loadobjectsfromfile(string filepath, List<GameObject> objs)
    {       while(...)
            {
                // other code lines
               // ...
                loadedObject.Add(gam);
                while (full_)
                {
                    yield return null;
                }  
                k++;
                yield return null; //<<<<<<<<<<<<<<HERE<<<<<<<<<<<<<<<<<<<<
            } }

3:开始下一个协程

buffer = StartCoroutine(setBufferToSpesificLocation(0));

4:运行至第一个产量

 IEnumerator setBufferToSpesificLocation(int startPoint)
    {

        for ( foo = startPoint; foo < loadedObject.Count; foo++)
        {

            while (full_)
            {
                yield return null;
            }

            put(loadedObject[foo]);

            yield return null; //<<<<<<<<<<<<<<HERE<<<<<<<<<<<<<<<<<<<<
        }

    }

4:停止缓冲区例程

StopCoroutine(buffer);

5:再次启动缓冲区,但现在将startPoint参数设置为50

buffer = StartCoroutine(setBufferToSpesificLocation(50));

6:达到第一个产量???不,foo = startPoint,现在是50 ...

IEnumerator setBufferToSpesificLocation(int startPoint)
    {
        //it will skip the loop as foo is 50 and loadedObject.Count is 1 (probabbly)
        for ( foo = startPoint; foo < loadedObject.Count; foo++) 
        {
            //code...
        }

        //WILL END THE COROUTINE
    }
© www.soinside.com 2019 - 2024. All rights reserved.