Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レイトレーシングとGoroutine
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takumasa Sakao
December 18, 2018
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
レイトレーシングとGoroutine
Takumasa Sakao
December 18, 2018
More Decks by Takumasa Sakao
See All by Takumasa Sakao
k9s のプラグイン機構とモダンな watch コマンド、viddy の紹介
sachaos
0
1.6k
Cloud Run でシェルスクリプトを動かす
sachaos
0
2.8k
GAE を利用したゲーム内通貨管理サービスの運用〜可用性を損なわないための工夫〜
sachaos
0
1.3k
Go の静的解析ツールの作成と活用
sachaos
0
3.2k
OSSを作っている時に 考えていること ーUNIX哲学を添えてー
sachaos
2
600
GCPをフル活用したゲームログ収集基盤の構築
sachaos
6
3.2k
Other Decks in Programming
See All in Programming
My Marp Sample
sinoue0108
0
110
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
200
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
240
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
220
VibeCodingからAgenticWorkflowへ
starfish719
0
770
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
仕様駆動開発の消費期限
watany
20
8.9k
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
100
源内ハンズオン概要編
hideg
0
210
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
380
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
240
プロポーザルを書いてもらう
pvcresin
0
570
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
For a Future-Friendly Web
brad_frost
183
10k
It's Worth the Effort
3n
188
29k
Making Projects Easy
brettharned
120
6.7k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
260
Ruling the World: When Life Gets Gamed
codingconduct
0
310
Music & Morning Musume
bryan
47
7.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
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
は楽しい • 演算子オーバーロードできないのは ベクトル演算の時に若干辛かった
ご静聴ありがとうございました