Blog?この広告は、90日以上更新していないブログに表示しています。2018-09-11レイトレのおまけレイトレ合宿6に出したやつでレイトレと直接関係の無いSwiftの都合の部分などを少し書いておこうと思います。レイトレ合宿6のホームページにはpngがありますが、とりあえず今回のレンダリング結果をjpgにしたものはこんな感じです。レンダリングが終わっています(笑とてもノイジーなのは突貫工事で突っ込んだglTF用のマテリアルでグロッシー成分のインポータンスサンプリングをさぼっているせいでしょう。手元のマシンで終わるくらいに設定しておけば、本番環境ではもっとサンプル数が増えるだろうからちょっとはマシになるんじゃないかと思ったのですがそんなうまい話はありませんでした。Dispatchさて、まずはDispatchについて。前回、Dispatchのqueue.asyncで並列化したらスレッドが大量に立って大変なことになっていたと書きました。Void)というfor文感覚で使うためのものがあることが判明。これを使うとちゃんとCPUのコア数だけのスレッドで処理してくれます。これについては自分の使い方が悪かったという話です。終わるまでブロックされてしまうので、途中経過を出すにはasyncの中で使うような工夫が必要になります。言い訳をすると、SwiftのDispatchはObjective-C時代から使われているAPIのラッパーです。DispatchQueue.concurrentPerformそこなんで全然違う名前に変えたの。いやapplyじゃ意味不明じゃない、という気持ちは解らなくはない。いうフリーダムなところはアップル系の良いところでもありますが。ArraySwiftのArrayは値型扱いさ。Writeという仕組みで変更されるまでは参照を共有してるだけだぜ。ちなみにこいつはスレッドセーフじゃない。これについては慣れればそんなもんかという程度のことなのですが、Dispatchと組み合わせて使って気づいたことがありました。スライドにもちらっと書いたことなのですが、Arrayの内容について処理するときにはいくつか書き方が考えられます。...}多くは(2)かなという気はしますが、(1)と(2)のiteratorを生成する処理は排他制御されているのか、並列処理の中で使うとパフォーマンスが上がらないことがありました。ことがありました、というのは大丈夫なこともあるようなんですよね...最初に気づいたのは三葉レイのコードをSwiftに移植してみたときで、流石にこれは遅すぎないかと思ったのがきっかけ。できるだけシンプルなものをGistにあげてみました。手元での実行結果はこんな感じになります。loopdone:0.414744019508362[sec]というわけで今回は並列処理内では基本的にインデックスでループさせるようにしました。小手先の技おまけの小ネタ。今回は全ピクセルに1回はレイが飛ぶようにとピクセル当たりのサンプル数を少なくして、代わりに何回も全体をレンダリングする弱気な設定にしていました。その上で、万が一全ピクセルに処理が行き渡らなかった場合に備えて導入したのがこれ。なんとタイル単位ではなく、ランダムなピクセルの位置を詰め込んだバケット単位でレンダリングしています。1回もレンダリングされていないピクセルはわかりやすいように青くしていますが、これなら前回のようにタイルが埋まり切っていないという一発でわかる未完状態にはならないという酷い発想です。そもそも画像テクスチャもないし、レイのコヒーレンシーとか気にするほど最適化されてないしという考えに基づいています(ォついでにデノイザーと組み合わせれば確実と思いましたが結局デノイザーは未実装になったので片手落ちです。ところがこれ、スレッド毎の負荷が平均化されたためかタイル単位でレンダリングするより少し速くなるという結果に。02:43レイトレのおまけTweet広告を非表示にする関連記事2018-09-09レイトレ合宿6に行ってきました9月1、2日に行われたレイトレ合宿6に行ってきました。breakdownOSLの次の一歩のためのメモレイトレのおまけレイトレ合宿6に行ってきました月別アーカイブ参加グループプログラミングはてなブログをはじめよう!c5h12さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。