如何限制Unity3D.Net中的通用列表堆栈?

如何限制Unity3D.Net中的通用列表堆栈?,.net,generics,unity3d,collections,stack,.net,Generics,Unity3d,Collections,Stack,我有一个搜索函数,可以填充空像素,并在每个搜索像素旁递归生成8个搜索,以填充空白,使用通用列表堆栈,尝试填充1000^3体素中的真/假值。i、 一个十亿大小的布尔数组 内存增加到10GB,然后出现内存错误 我想删除堆栈中的重复项,并找到一种方法来限制它,而不会错过泛洪填充检查。如果我忽略了应该运行/验证的堆栈条目,泛洪填充可能会失败。如何对堆栈进行重复数据消除 function floodFill( q: Vector3 ) //floodfill algo of 3d bool voxel

我有一个搜索函数,可以填充空像素,并在每个搜索像素旁递归生成8个搜索,以填充空白,使用通用列表堆栈,尝试填充1000^3体素中的真/假值。i、 一个十亿大小的布尔数组

内存增加到10GB,然后出现内存错误

我想删除堆栈中的重复项,并找到一种方法来限制它,而不会错过泛洪填充检查。如果我忽略了应该运行/验证的堆栈条目,泛洪填充可能会失败。如何对堆栈进行重复数据消除

function floodFill( q: Vector3  ) //floodfill algo of 3d bool voxel cubes starting from point q
{   
    if ( q.x < 0 || q.x > bsizex || q.y < 0 || q.y > bsizey || q.z < 0 || q.z > bsizez) return;

    var stack : Stack.<Vector3>  = new Stack.<Vector3>();
    stack.Push(q);
     while (stack.Count > 0)
    {
        if ( CountFilledVoxels % 100000== 0 )//display progress readout
        {
            print(CountFilledVoxels+ "   ------     " +
            (Time.realtimeSinceStartup-tt)+" -=-=-== " + stack.Count );
            yield WaitForFixedUpdate(); 
        }

        var p : Vector3= stack.Pop();
        var x = p.x;
        var y = p.y;
        var z = p.z;
        if ( x < 0 || x > bsizex || y < 0 || y > bsizey || z < 0 || z > bsizez) continue;

        if (readBoolArray( x , y , z ) == false)
        {
            WriteBoolArray( x , y , z , true) ;

            stack.Push(new Vector3(x+1,y,z));
            stack.Push(new Vector3(x-1,y,z));
            stack.Push(new Vector3(x,y+1,z));
            stack.Push(new Vector3(x,y-1,z));
            stack.Push(new Vector3(x,y,z+1));
            stack.Push(new Vector3(x,y,z-1));               
        }                         
    }                             
}
函数泛光填充(q:Vector3)//从点q开始的3d布尔体素立方体的泛光填充算法
{   
如果(q.x<0 | | q.x>bsizex | | q.y<0 | | q.y>bsizey | | q.z<0 | q.z>bsizez)返回;
变量堆栈:堆栈=新堆栈。();
栈推(q);
而(stack.Count>0)
{
如果(CountFilled体素%100000==0)//显示进度读数
{
打印(CountFilled体素+“----”+
(Time.realtimesincesttartup tt)+“-=-=-=++stack.Count);
产生WaitForFixedUpdate();
}
var p:Vector3=stack.Pop();
var x=p.x;
var y=p.y;
var z=p.z;
如果(x<0 | x>bsizex | y<0 | y>bsizey | z<0 | z>bsizez)继续;
if(readBoolArray(x,y,z)=false)
{
写极射线(x,y,z,真);
推(新矢量3(x+1,y,z));
叠加推(新矢量3(x-1,y,z));
推(新矢量3(x,y+1,z));
叠加推(新矢量3(x,y-1,z));
推(新矢量3(x,y,z+1));
叠加推(新矢量3(x,y,z-1));
}                         
}                             
}

如果我错了,请纠正我,但您的堆栈表示一个三维向量数组,每个向量线性地表示自己的坐标?我在这里写了一个完整的解决方案: