Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レイトレーシングとGoroutine
Search
Takumasa Sakao
December 18, 2018
Programming
2
1.2k
レイトレーシングとGoroutine
Takumasa Sakao
December 18, 2018
Tweet
Share
More Decks by Takumasa Sakao
See All by Takumasa Sakao
k9s のプラグイン機構とモダンな watch コマンド、viddy の紹介
sachaos
0
1.5k
Cloud Run でシェルスクリプトを動かす
sachaos
0
2.8k
GAE を利用したゲーム内通貨管理サービスの運用〜可用性を損なわないための工夫〜
sachaos
0
1.2k
Go の静的解析ツールの作成と活用
sachaos
0
3k
OSSを作っている時に 考えていること ーUNIX哲学を添えてー
sachaos
2
570
GCPをフル活用したゲームログ収集基盤の構築
sachaos
6
3.1k
Other Decks in Programming
See All in Programming
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
410
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
360
これならできる!個人開発のすゝめ
tinykitten
PRO
0
130
Deno Tunnel を使ってみた話
kamekyame
0
240
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3k
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
170
愛される翻訳の秘訣
kishikawakatsumi
3
340
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
190
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
160
Grafana:建立系統全知視角的捷徑
blueswen
0
190
AIエージェントの設計で注意するべきポイント6選
har1101
5
2.3k
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
630
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
170
Paper Plane
katiecoart
PRO
0
44k
How to make the Groovebox
asonas
2
1.8k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
110
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
97
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
130
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
290
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
How to Talk to Developers About Accessibility
jct
1
85
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
94
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
170
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.8k
Transcript
レイトレーシングと Goroutine golang.tokyo #20 @sachaos
自己紹介 • @sachaos (サカオスと読みます) Twitter, GitHub もこれでやってます。 フォローしてくれると嬉しいです。
• 所属: 株式会社アカツキ 新卒 3 年目 技術基盤開発 主に GAE/Go を触っています。 Go エンジニア募集中です。
レイトレーシングとは? • 3D を描画する手法の一つ。 • Pros 光の反射を綺麗に描画できる。 アルゴリズムが直感的。
• Cons 非常に計算時間がかかる • リアルタイムに描画しなければならないゲームではあまり使われていない • 映画など予め描画して映像を作成できれば済むようなものに使用される
そもそも 我々はどのようにして物を”視る“のか? 僕は赤を強く 反射する 赤い
そもそも 我々はどのようにして物を”視る“のか? 僕は赤を強く 反射する 赤い そもそも 我々はどのようにして物を”視る“のか? • 光源が光を発する •
光は空間内の物体にぶつかったら反射・屈折する • 反射・屈折してたまたま目に入った光から 情報を結合して物を認識する。
レイトレーシングでは逆に カメラからレイ(視線)を飛ばす 僕は赤を強く 反射する
レイトレーシングでは逆に カメラからレイ(視線)を飛ばす 僕は赤を強く 反射する • スクリーンの各ピクセルからレイ(視線)を飛ばす • 空間内の物体に衝突したら反射・屈折させる • 再帰的に最終的なピクセルの色を計算する
レイトレーシングでは逆に カメラからレイ(視線)を飛ばす
これを Go で フルスクラッチ実装してみました • https://github.com/sachaos/go-simple-raytracer • 実装的にはそこまで難しくはない • 高校数学(ベクトル)を理解できていれば
コーディングできます
主な部品
カメラ • ピクセル毎にレイ(視線) を飛ばす。 • アンチエイリアス: ピクセル毎にランダムに N個のレイを飛ばす。 N=3 N=100
反射するマテリアル • 金属、鏡のような 質感の物 • 単純にベクトルを 反射させる 入射レイ 反射レイ
乱反射するマテリアル • マットな質感の物 • レイが来た時にランダム に反射させる ランダムに 方向を決める 入射レイ
Go を使うメリット • 標準パッケージで十分書ける image/png で PNG を吐き出したりがシュッとできる。
ベクトル計算は筋肉で書きました。 • レイトレーシングは並行処理が可能 Goroutine で計算することができる! (補足: 本来は GPU で並列計算します)
筋肉で書いた vector.go
並行処理が可能なので シュッと Goroutine にしてみる • これで速くなるはず!
並行処理が可能なので シュッと Goroutine にしてみる • これで速くなるはず! • 実際にやってみると速くならない!!! むしろ遅くなった
(51s => 1m24s)
なぜか? pprof を使って見てみる • rand/math が原因である事がわかった。 • rand/math は goroutine
safe で ロックを取っているので競合してしまう。
mono0x/prand を使ってみた • https://github.com/mono0x/prand • rand を複数作っておいて プールして使い回す実装の様子 • Goroutine
間で競合が起こるのを防ぐ事ができる。
問題解消、速くなった! • 51s => 30s に!
Go で書いた感想 • シュッと Goroutine が決まると気持ちいい • 標準パッケージだけでも こんなに遊べるので Go
は楽しい • 演算子オーバーロードできないのは ベクトル演算の時に若干辛かった
ご静聴ありがとうございました