【发布时间】:2020-04-30 06:04:37
【问题描述】:
在 Unity c# 中,我从 json 获取数据,并使用嵌套循环(如下代码)查找/比较游戏对象以在本地游戏对象中设置该数据。但是在达到一定数量的对象(> 275)后,我得到了 StackOverflowException 错误。基本上 80 次循环运行 10 次,运行 300 次,请参见下面的代码。(注意:此代码在 j
public void SetDataInObject()
{
if (j < ObjList.objects.Count) //count is approx 300
{
for (int k = 0; k < allObjs.Length; k++) // Length is 10
{
stCalc = uiMana.floorStats[k].GetComponent<StatesCalc>();
for (int m = 0; m < allObjs[k].floorObjs.Length; m++) //Length is 80
{
string serverObj = ObjList.objects[j].name;
string localObj = allObjs[k].floorObjs[m].gameObject.name;
if (localObj == serverObj)
{
ObjManager curObjManger = allObjs[k].floorObjs[m].GetComponent<ObjManager>();
//Logic to set data in local objects
}
}
}
j++;
SetDataInObject();
}
}
【问题讨论】:
-
如果递归方法最终有一个很深的调用堆栈,就会发生这种情况。您可能想尝试切换到迭代方法。
-
另外
j似乎应该是一个局部变量。拥有一个基本上用作方法索引器的字段变量是一个坏主意。如果你需要控制它从哪里开始,那么你可以将它传递给函数。 -
一种迭代方法是将第一行更改为
while(j < ObjList.objects.Count)并删除递归调用SetDataInObject,但我看不出这有什么帮助 - 我看不到任何对象被创建将通过递归调用持续存在(但我整晚都没有睡,所以这当然是可能的!) -
同意 juharr .. 如果您可能更愿意将
j+1作为参数传递给SetDataInObject(int j)。或者没有for(var j = 0; j < ObjList.objects.Count; j++)的原因是什么?无论如何,我看不到任何可以更改该列表的行。还反复调用GetComponent非常昂贵.. 如果可能的话,你应该事先缓存这些。
标签: c# unity3d stack-overflow nested-loops