Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
レイトレーシングとGoroutine
Search
Takumasa Sakao
December 18, 2018
Programming
1.3k
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.9k
GAE を利用したゲーム内通貨管理サービスの運用〜可用性を損なわないための工夫〜
sachaos
0
1.3k
Go の静的解析ツールの作成と活用
sachaos
0
3.2k
OSSを作っている時に 考えていること ーUNIX哲学を添えてー
sachaos
2
610
GCPをフル活用したゲームログ収集基盤の構築
sachaos
6
3.2k
Other Decks in Programming
See All in Programming
JIS keyboard support in Omarchy
lef237
0
160
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
250
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
150
続・コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions-again
handlename
0
130
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.9k
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
contenteditable と日本語入力に向き合う
colorful12
0
230
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
1.6k
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
390
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
200
phperだってパンチカードでコーディングしたい
o0h
PRO
0
480
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.3k
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
370
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Code Reviewing Like a Champion
maltzj
529
40k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
430
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
460
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
550
Side Projects
sachag
456
43k
Scaling GitHub
holman
464
140k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Evolving SEO for Evolving Search Engines
ryanjones
0
330
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
は楽しい • 演算子オーバーロードできないのは ベクトル演算の時に若干辛かった
ご静聴ありがとうございました