每当我调用此函数时,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 不再响应的主要内容,如果未能解决你的问题,请参考以下文章

每当我的 Apollo 订阅在 React 中被触发时,我如何调用函数?

Unity的生命周期函数

onreadystatechange 事件

如何随机调用函数unity c# [重复]

在Vue中使用GSAP完成动画(三)动画事件

React - 每当更新反应上下文中的状态时如何调用函数?