如何限制Unity3D.Net中的通用列表堆栈?
我有一个搜索函数,可以填充空像素,并在每个搜索像素旁递归生成8个搜索,以填充空白,使用通用列表堆栈,尝试填充1000^3体素中的真/假值。i、 一个十亿大小的布尔数组 内存增加到10GB,然后出现内存错误 我想删除堆栈中的重复项,并找到一种方法来限制它,而不会错过泛洪填充检查。如果我忽略了应该运行/验证的堆栈条目,泛洪填充可能会失败。如何对堆栈进行重复数据消除如何限制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
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));
}
}
}
如果我错了,请纠正我,但您的堆栈表示一个三维向量数组,每个向量线性地表示自己的坐标?我在这里写了一个完整的解决方案: