Wonderflで汚名返上


Ambient Occlusion Rendering | Si+(wonderfl.net)


Ambient Occlusion といっても,最近リアルタイム大域照明界隈で流行ってるらしい Depth Buffer を利用した Ambient Occlusion じゃ無くて,元ネタはここ.

この AObench は,古典的なレイトレーシングで,Path tracingによる大域照明計算の Diffusion の項を Ambient Occlusion で超簡略化した物(と,ソース読んで自分なりに解釈してる).


んで,AObench は,実はすでにSyoyoさん本人の手で ActionScript3 実装が為されている↓.

この記事を読んだ時(去年10月頃)は確かコードが公開されてて,当時軽く眺めただけだったんだけど,ActionScript3のコードとしてあまり効率が良くない印象があった.で,あとでじっくり読もうと思って上エントリをブクマしておいたんだけど,昨日久々に見にいったらソースが無くなってた.
しかも,Flash10はProce55ingの7倍遅いとか書いてあるじゃないですかっ!!
このままでは ActionScript3 の性能が不当に低く評価されてしまうっ!!
ASerの端くれとして,このまま放置するのはマズイっ!!
という事で,ActionScript3 の汚名返上のためにオリジナルのソースをベースにActionScript3に再移植を行ってみました.


すいません,半分ウソ.本当はコードトレースしてAmbient Occlusionを理解するのが目的だったので,ActionScript3で効率が上がるように書き換えつつも,レイの計算処理自体はオリジナルと同じになるように書いた.自環境での結果↓(3回試行平均値)

Proce55ing; 11.412[sec]
ActionScript3; 10.641[sec]

自分の環境では,ほぼ同タイムかAS3の方が若干早いという結果になった.特にズルはしてないはずなんだけど,Syoyoさんの実装に比べて7倍速ってのは自分でも予想外だった.これは,最適化の時にレイ計算処理を弄ってしまった可能性があるので,wonderflに上げたコード見て,これはおかしいと思ったら突っ込んでください.


今回の件で,Syoyoさんみたいに大域照明レンダラをバリバリ書くような猛者でも,ActionScript3で適当に書くとかなり遅く動いてしまう危険性があるんだなという感想を持った.これは ActionScript3 というかLL全体にいえる事だけど,適当に書いても動くというのは,こと効率面では罠だよなーと思う.LLでベンチを取る時は注意しないといけないなぁ,と感じた.