ボクセルベースの3Dルームで大きな部屋が密閉されているかどうかを効率的に判断する際に、いくつか問題がありました。私は助けを求めずに問題を解決するために全力を尽くしましたが、あきらめるのに十分なほど試みなかったので、助けを求めています。
明確にするために、部屋に穴が開いていないことを密封しています。部屋が密閉されているかどうかを確認する酸素シーラーと、酸素入力レベルに応じて密閉する酸素シーラーがあります。
今、これが私がやっている方法です:
- シーラータイルの上のブロックから始まり(ベントはシーラーの上面にあります)、6つの隣接する方向すべてに再帰的にループします
- 隣接するタイルが完全な非真空タイルである場合は、ループを続行します
- 隣接するタイルがいっぱいではない場合、またはバキュームタイルである場合、隣接するブロックが再帰的に満たされているかどうかを確認します。
- タイルがチェックされるたびに、カウンターをデクリメントします
- カウントが0に達した場合、最後のブロックがバキュームタイルに隣接している場合は、領域がシールされていないことを返します
- カウントがゼロになり、最後のブロックがバキュームタイルではない場合、またはカウンターがゼロになる前に再帰ループが終了する(バキュームタイルが残っていない)場合、領域はシールされます。
エリアがシールされていない場合は、いくつかの変更を加えてループを再度実行します。
- 真空タイルの代わりに「通気性のある」タイルの隣接ブロックをチェックする
- 減少するカウンターを使用する代わりに、隣接する「通気性のある」タイルが見つからなくなるまで続けます。
- ループが終了したら、チェックされた各ブロックをバキュームタイルに設定します。
これが私が使用しているコードです:http : //pastebin.com/NimyKncC
問題:
私は3秒ごとにこのチェックを実行しています。シーラーは数百のブロックをループする必要がある場合があり、酸素シーラーが多い大きな世界では、数秒ごとにこれらの複数の再帰ループがCPUで非常に困難になる場合があります。
最適化の経験が豊富な方が私に手を貸してくれないか、少なくとも私を正しい方向に向けられるかどうか疑問に思っていました。本当にありがとう。