【问题标题】:Whenever I call this function Unity doesn't respond anymore每当我调用此函数时,Unity 不再响应
【发布时间】: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

标签: c# unity3d


【解决方案1】:

冻结通常意味着您在某处有一个永无止境的循环。

您的所有循环都是有限的,没有什么应该花费超过几毫秒的时间 - 除了一个

你有

for(int s = 0; s < 9; s++)
{
    if(p == Reihe * 9 - 9 + s)
    {
        s = Spalte;
    }
}

您重新分配s = 0 的位置,因为Spalte 的分配方式从未不同。所以你重新开始循环,如果这个条件满足一次,那么它肯定会在未来的迭代中得到满足,因为在那个循环中其他参数都没有改变 => 永远不会结束循环。

从你的其余代码来看,它可能应该是

Spalte = s;

【讨论】:

    猜你喜欢
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多