簡體   English   中英

使用C#和Mono,遞歸函數的堆棧溢出

[英]Stack overflow with C# and Mono, recursive function

我正在使用基於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;
}

開始時將voxelsAttached設置為所有false。 如果需要使用體素,則GetPixel()。a返回。

如何解決此堆棧溢出?

下面的一個不會溢出堆棧。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM