https://github.com/wtnb75/rtow1#performance
話題沸騰(?)のRayTracing In One Weekendやってレイトレを完全に理解しました。性能度外視でいいかとPythonでやりましたが、PyPyを使うと割と実用的な速度で動くということがわかった。環境としては、普通に世間でvCoreとか言って売ってるVPSと、手元のRaspberry Pi。普通のCPythonは十分遅いけど、PyPyを使うことでそこそこ高速に動くことができる。Raspberry Piは2Bと3Bの2つ持ってて、2Bの方は設置場所の問題もあって、負荷をかけ続けると安定動作してくれない。最後のやつはついに完成しませんでした。どうしても途中で落ちてしまう。3Bは余裕だった。
それでこういう計算の場合、PyPyはPythonよりも10倍以上高速だということが判明した。なかなか凄いです。何より、ちゃんと動くという点も偉い。PyPyなかなか侮れませんよ。
しかしCPythonだと流石にきついね。最後のなんて、Xeonなのに45時間もかかりましたよ。PyPyなら1時間半で終わる。まあ、最適化も何もしてないGILありのPythonでシングルスレッドだから、高速とは最初から思っていないけども。まー単純にmultiprocessingで並列化するだけでもかなり効果はあると思うけどね。RasPi3Bだって4コア持ってるから。
このレイトレの説明自体は英語ではありますが十分にシンプルで分かりやすいと思いました。最近日本語訳もされたそうです。とりあえずPythonで作って動かしている間に説明を読む、みたいな感じで進めました。サンプルコードはところどころバグが仕込んであったりする。ちゃんと説明されているので直せるんだけど、私はこれを自力で見つけて直せるレベルまではまだ行ってないなー。
最初の週は法線ベクトルを求めたり衝突判定が簡単な球体のみ、反射と屈折を計算し、アンチエイリアスをかけ、最後にカメラアングルの変更とかが入ってました。これだけで割と良い感じのグラフィックを作れるとは、感動しますよね。POV-Rayと格闘していた若い頃を思い出した。最後の画像のカメラアングルのパラメータは本文にはなかったので、他の人が別の言語でやってネットに転がっていたアングルを採用させてもらった。
次の週はこれからですが、モーションブラー・平面・光源やテクスチャが入ったりして、なかなか楽しそうです。