2016-04-11 12 views
1

私は動作しますが(まだ)照明を持っていないレイトレーサーを作ってるんです。知らない人のために、レイトレーストレーサーは、カメラのビューア(ビューア)から画面の各ピクセルを送信し、3D空間内のオブジェクトの衝突をテストし、レイがオブジェクトに当たった場合にピクセルを着色することによって動作します。Javaの:マルチスレッドと2Dのスレッド

あなたは計算のたくさんある各画素の計算を実行する必要があります。だから私はピクセルの各列のスレッドを持っています。現時点では、私はRunnableを実装しています。これにより、プログラムの速度が向上し、外部プロセスの全体的な処理速度(これは良い)に顕著な影響はありません。

照明については、カメラの光線がオブジェクトと交差する3D空間でポイントを取得し、そのポイントを点灯させる必要があります(存在するすべての光源を考慮してください)マルチスレッド)。私が持っスレッドが複数のスレッド(2Dがスレッド)を作成することを想像

が悪い習慣ですが、それが効率的になり、これを実現するためのいくつかのライブラリーまたは方法はありますか?私はこれが無限回帰につながることはないと知っていますが、私はCPUを過負荷にしたくありません。基本的に、「2Dスレッド」を安全に必要とするプロセスをどのように処理するのですか?

+2

あなたは[ 'RecursiveAction']を使用することができます(https://docs.oracle.com/javase/8/docs/api/java /util/concurrent/RecursiveAction.html)。 「ForkJoinPoolのレイトレーシング」についてグーグルで試してみてください。 –

答えて

2

あなたは自分のスレッドを管理するためにExecutorServiceを使用することができます。おそらくExecutors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())を試してみてください。

Runnableの実装では、Runnableインスタンスがさらに作成され、同じExecutorServiceに送信される可能性があります。無限再帰を作成しないと確信できる場合は、完了まで実行して、使用可能なハードウェアより多くのスレッドを使用しないでください。注意する必要があるのは、メモリーが不足しているインスタンスを非常に多く作成しないということだけです。また、すべてのRunnableインスタンスが完了した時点を把握する必要がありますが、サービスはそれを行うためのメカニズムを提供します(Java APIのFutureを参照)。線コヒーレンス - あなたがスレッドごとに列をやっている場合は

1

、あなたはタイル張りの利点の一つを失っています。正直言って、私はそれが特に有利だとは思っていませんでしたが、再び、私はアーノルドやメンタルレイでは働いていません...私は一本の線で始まり、あなたの品質とPPSをできるだけ高く、その後、別のスレッドにあなたのイメージの正方形を行う農業...

関連する問題