使用C#和Mono递归函数的堆栈溢出

使用C#和Mono递归函数的堆栈溢出,c#,unity3d,stack-overflow,C#,Unity3d,Stack Overflow,我正在使用基于Mono框架和C#的Unity3D。下面的函数抛出堆栈溢出。我不知道这些是从哪里来的;通常,现在这种情况只会发生在无限循环中,而我的不是。它适用于8x8x16体素,但在16x16x32体素时崩溃。我设置了一个锁,因为我认为在第一次完成之前可能会再次启动该函数 int FloatingVoxelsFlood(int x, int y, int z, ref bool[] voxelsAttached) { if (GetPixel(x, y, z).a > 0.5f)

我正在使用基于Mono框架和C#的Unity3D。下面的函数抛出堆栈溢出。我不知道这些是从哪里来的;通常,现在这种情况只会发生在无限循环中,而我的不是。它适用于8x8x16体素,但在16x16x32体素时崩溃。我设置了一个锁,因为我认为在第一次完成之前可能会再次启动该函数

int FloatingVoxelsFlood(int x, int y, int z, ref bool[] voxelsAttached) {
    if (GetPixel(x, y, z).a > 0.5f) return 0;

    int id = GetPixelId(x, y, z);
    if (voxelsAttached[id]) return 0;

    voxelsAttached[id] = true;

    int count = 1;

    int minx = x-1;
    int maxx = x+1;
    if (minx >= 0) 
        count += FloatingVoxelsFlood(minx, y, z, ref voxelsAttached);
    if (maxx < volumeWidth) 
        count += FloatingVoxelsFlood(maxx, y, z, ref voxelsAttached);

    int miny = y-1;
    int maxy = y+1;
    if (miny >= 0) 
        count += FloatingVoxelsFlood(x, miny, z, ref voxelsAttached);
    if (maxy < volumeHeight) 
        count += FloatingVoxelsFlood(x, maxy, z, ref voxelsAttached);

    int minz = z-1;
    int maxz = z+1;
    if (minz >= 0) 
        count += FloatingVoxelsFlood(x, y, minz, ref voxelsAttached);
    if (maxz < volumeDepth) 
        count += FloatingVoxelsFlood(x, y, maxz, ref voxelsAttached);

    return count;
}
int FloatingVoxelsFlood(int x,int y,int z,ref bool[]体素附加){
if(GetPixel(x,y,z).a>0.5f)返回0;
int id=GetPixelId(x,y,z);
如果(体素附加[id])返回0;
体素附加[id]=真;
整数计数=1;
int minx=x-1;
int maxx=x+1;
如果(最小值>=0)
计数+=浮动体素血液(minx、y、z、ref体素附加);
如果(最大值<体积宽度)
计数+=浮动体素血液(maxx、y、z、ref体素附着);
int miny=y-1;
int maxy=y+1;
如果(最小值>=0)
count+=FloatingVoxelsFlood(x,miny,z,ref voxelsAttached);
if(最大值<体积高度)
计数+=浮动体素血液(x,maxy,z,参考体素附着);
int minz=z-1;
int maxz=z+1;
如果(最小值>=0)
计数+=浮动体素血液(x,y,minz,ref体素附着);
如果(最大值<体积深度)
计数+=浮动体素血液(x、y、maxz、ref体素附着);
返回计数;
}
“体素附着”在开始时设置为“全部假”。GetPixel()。如果需要使用体素,则返回


如何解决堆栈溢出问题?

下面的问题不会使堆栈溢出

int FloatingVoxelsFlood(int x, int y, int z, ref bool[] voxelsAttached) {
    if (GetPixel(x, y, z).a > 0.5f) return 0;

    Queue<Pixel> queue = new Queue<Pixel>();
    queue.Enqueue(new Pixel(x, y, z));

    int count = 0;
    while(queue.Count > 0) {
        Pixel p = queue.Dequeue();

        int id = GetPixelId(p.x, p.y, p.z);
        if (!voxelsAttached[id] && GetPixel(p.x, p.y, p.z).a < 0.5f) {
            count++;
            voxelsAttached[id] = true;

            int minx = p.x-1;
            int maxx = p.x+1;
            if (minx >= 0) 
                queue.Enqueue(new Pixel(minx, p.y, p.z));
            if (maxx < volumeWidth) 
                queue.Enqueue(new Pixel(maxx, p.y, p.z));

            int miny = p.y-1;
            int maxy = p.y+1;
            if (miny >= 0) 
                queue.Enqueue(new Pixel(p.x, miny, p.z));
            if (maxy < volumeHeight) 
                queue.Enqueue(new Pixel(p.x, maxy, p.z));

            int minz = p.z-1;
            int maxz = p.z+1;
            if (minz >= 0) 
                queue.Enqueue(new Pixel(p.x, p.y, minz));
            if (maxz < volumeDepth) 
                queue.Enqueue(new Pixel(p.x, p.y, maxz));
        }
    }

    return count;
}
int FloatingVoxelsFlood(int x,int y,int z,ref bool[]体素附加){
if(GetPixel(x,y,z).a>0.5f)返回0;
队列=新队列();
排队(新像素(x,y,z));
整数计数=0;
而(queue.Count>0){
像素p=queue.Dequeue();
int id=GetPixelId(p.x,p.y,p.z);
如果(!体素附加[id]&&GetPixel(p.x,p.y,p.z).a<0.5f){
计数++;
体素附加[id]=真;
int minx=p.x-1;
int maxx=p.x+1;
如果(最小值>=0)
排队(新像素(minx,p.y,p.z));
如果(最大值<体积宽度)
排队(新像素(maxx,p.y,p.z));
int miny=p.y-1;
int maxy=p.y+1;
如果(最小值>=0)
排队(新像素(p.x,miny,p.z));
if(最大值<体积高度)
排队(新像素(p.x,maxy,p.z));
int minz=p.z-1;
int maxz=p.z+1;
如果(最小值>=0)
排队(新像素(p.x,p.y,minz));
如果(最大值<体积深度)
排队(新像素(p.x,p.y,maxz));
}
}
返回计数;
}