タグ付けされた質問 「recursion」

4
Minecraftスタイルのゲームでオクルージョンを使用してボクセルベースの照明を実装するにはどうすればよいですか?
C#とXNAを使用しています。私の現在の照明のアルゴリズムは、再帰的な方法です。ただし、5秒ごとに1つの8x128x8チャンクが計算されるほど高価です。 暗闇の可変シャドウを作成する他の照明方法はありますか? または、再帰的な方法は良いですか、おそらく私はそれを間違っていますか? 再帰的なものは基本的に高価なようです(チャンクごとに約25kブロックを通過させる)。レイトレーシングに似た方法を使用することを考えていましたが、これがどのように機能するかわかりません。私が試した別のことは、リストに光源を保存し、各ブロックが各光源までの距離を取得し、それを使用して正しいレベルに照明することでしたが、照明は壁を通り抜けます。 私の現在の再帰コードは以下です。これは、太陽光とトーチライトをクリアして再度追加した後、チャンク内の光レベルがゼロでない任意の場所から呼び出されます。 world.get___atこのチャンクの外部のブロックを取得できる関数です(これはチャンククラスの内部にあります)。Locationは、のような独自の構造ですがVector3、浮動小数点値の代わりに整数を使用します。light[,,]チャンクのライトマップです。 private void recursiveLight(int x, int y, int z, byte lightLevel) { Location loc = new Location(x + chunkx * 8, y, z + chunky * 8); if (world.getBlockAt(loc).BlockData.isSolid) return; lightLevel--; if (world.getLightAt(loc) >= lightLevel || lightLevel <= 0) return; if (y < 0 || …

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