実行時にフレームを返す再帰関数を強制するにはどうすればよいですか?再帰関数がスキップフレームを生成するように強制するには?
私は、再帰関数の異なる段階でyield関数を配置しようとしました。
私は何が起こっているのか分かりません。なぜなら、1000回の再帰ごとに時間を印刷するための条件は無視され、およそ100万回の再帰のみを生成して出力するからです。ピックアップすべき印刷コマンドの90%はコードによって無視され、表示されません。 ランタイムは1〜2分ごとに実行され、一度に12のステートメントを出力します。
これは私が管理しているコードの中で最も速いバージョンです。 yield文を上下に変更すると、ランタイムが完全にフリーズすることがあり、10分間何も起こりません。
なぜフリーズし、どのように変更できますか?
//A working 3D floodfill function that reads and writes a boolean voxel array:
private var maxAbort = 1000000000;
function boundary(x:int, y:int, z:int): IEnumerator //floodfill algo
{
if (read3DboolArray(x,y,z)==false && bcnt<maxAbort){//pprevent stackoverflow with limit FASTER
if (x >= 0 && x < bsizex && y >= 0 && y < bsizey && z >= 0 && z < bsizez)
{
write3DboolArray(x,y,z,true);
boundary(x+1,y,z);
boundary(x-1,y,z); yield WaitForFixedUpdate();
boundary(x,y+1,z);
boundary(x,y-1,z); // yield WaitForFixedUpdate();
boundary(x,y,z+1);
boundary(x,y,z-1);
}
if (bcnt % 1000== 0)//mark new start if ended this recursion run
{
print(bcnt+ " ------ " +
(Time.realtimeSinceStartup-tt));
bcnt+=1;
yield WaitForFixedUpdate();
}
} else return;
}
本方法における収率を用い.NETフレームワーク2.0
これを一般的なスタックよりも優れた方法で解決しました。結果は次のとおりです。https://unity3dmc.blogspot.fr/2017/02/ultimate-3d-floodfill-scanline.html –