每当我调用此函数时,Unity 不再响应
Posted
技术标签:
【中文标题】每当我调用此函数时,Unity 不再响应【英文标题】:Whenever I call this function Unity doesn't respond anymore 【发布时间】:2022-01-21 01:33:47 【问题描述】:如果我通过按钮调用此功能,我总是必须通过任务管理器关闭 Unity,我的代码有什么问题?我知道此代码需要进行大量处理,但该过程永远不会完成:
public void SudokuLösen()
for(int p = 1; p < 81; p++)
if(PositionWert[p] != 0)
for(int z = 1; z < 9; z++)
if(PositionWert[p] == z)
int Reihe = 0;
int Spalte = 0;
int Platz = 0;
for(int m = 0; m < 8; m++)
for(int r = 1; r < 9; r++)
if(p - m * 9 == r)
Reihe = r;
for(int s = 0; s < 9; s++)
if(p == Reihe * 9 - 9 + s )
s = Spalte;
for(int g = -8; g < 8; g++)
if((Spalte + g > 0) && (Spalte + g < 10))
Blockiert[(p + z * 81 - 81) + g] = true;
if((Reihe + g > 0) && (Reihe + g < 10))
Blockiert[(p + z * 81 - 81) + g * 9] = true;
for(int vx = 1; vx < 3; vx++)
if((Spalte == 0 + vx) || (Spalte == 3 + vx) || (Spalte == 6 + vx))
Platz += vx;
if((Reihe == 0 + vx) || (Reihe == 3 + vx) || (Reihe == 6 + vx))
Platz += (3 * vx - 3);
for(int q = 1; q < 4; q++)
Blockiert[(p + z * 81 - 81) + Quadrat[Platz * 4 - 4 + q]] = true;
数组的定义如下:
public static bool[] Blockiert = new bool[730];
public static int[] PositionWert = new int[82];
private int[] Quadrat = 0, 10, 11, 19, 20, 8, 10, 17, 19, 7, 8, 16, 17, -8, -7, 10, 11, -10, -8, 8, 10, -11, -10, 7, 8, -17, -16, -8, -7, -19, -17, -10, -8, -20, -19, -11, -10;
我认为这可能只是因为我的计算机会永远调用这个函数,所以我等了很长时间,发现 Unity 几乎使用了我 15% 的 CPU,所以它并没有真正做太多事情和函数处理只是没有完成。
有谁知道哪里出了问题或我应该改变什么?
【问题讨论】:
这可能需要很长时间,但应该会完成。附加 Visual Studio 并暂停执行以检查它是否仍在运行。您也可以使用断点。检查文档Debugging C# code in Unity 好的,如果是这样,那么我应该改变什么以使其更快,因为这不会花费很长时间 我在s = Spalte;
看到对您的循环索引的重新分配。你认为你有一个无限循环吗?请包括minimal reproducible example
【参考方案1】:
冻结通常意味着您在某处有一个永无止境的循环。
您的所有循环都是有限的,没有什么应该花费超过几毫秒的时间 - 除了一个!
你有
for(int s = 0; s < 9; s++)
if(p == Reihe * 9 - 9 + s)
s = Spalte;
您重新分配s = 0
的位置,因为Spalte
的分配方式从未不同。所以你重新开始循环,如果这个条件满足一次,那么它肯定会在未来的迭代中得到满足,因为在那个循环中其他参数都没有改变 => 永远不会结束循环。
从你的其余代码来看,它可能应该是
Spalte = s;
【讨论】:
以上是关于每当我调用此函数时,Unity 不再响应的主要内容,如果未能解决你的问题,请参考以下文章