任何人都可以解释我的代码的问题吗?
我在程序开始时启动了两个协程。这些是:
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 {}循环”
我不知道您为什么要启动协程然后立即将其停止。当您调用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
}