DeskTopLive.asイベントレポート,3回目は小阪淳さんです。
小阪さんといえば,イベントの際は「僕は今日はアンチFlashでいきます!」とおっしゃってDirectorの魅力をご紹介してくださったのですが,実は,あの『4D2Uナビゲーター』がAS1で書かれていた,という話もあり,濃い裏話を期待してお邪魔しました。
では早速…。
──DTL.asお疲れ様でした。事前打ち合わせでお話ししていた,「プログラムの最適化」あたりから,是非聞かせてください。
小阪さん(以降,小):僕,Flashをすごく初期の頃,「FutureSplash」という名前の頃から使ってて,丁度,プログラム環境として成熟していくのを追いながらやっていました。最初は変数すらなかったんですよ。
──そうですね。僕も,そしてたぶん今Flash界に居る方も,その時代を知らない方も多いと思うので…「FutureSplash Animater」どんな感じだったんでしょう?タイムラインは今の物と同じだったんですよね?
小:そうですね。Directorもそうなんですけど,プログラムというよりは”タイムラインの制御用のマクロ”としての役割だったんです最初は。だから,それこそ変数ではなく,フレームの指定しかできないんですよ。 フレームナンバーなんぼまで飛びますと。[gotoAndPlay]。
──gotoAndPlayはあったんですね。
小:そう。基本的に[gotoAndPlay] 的なものと[gotoAndStop] 的なもののためのものですね。
ボタンを押したら次のシーンに動く。その程度のマクロを組むためのものだったんです。
例えば,その当時,変数を使うためには,いちいち”変数用のムービークリップ”を使って今どこにいるかを変数にするんですよね。で,1あがったら,変数で普通++ってして1あげるのを,フレームを1個動かしてって…。
──あぁ,もうフレームが記憶領域なんですね。
小:そうそう。すごいハイエンドな環境で,ローエンドな事やってる。何か良く分かんない事になってる。(笑)
僕がFlash4で,簡単な物理的なシミュレーション,例えば,バネをのばした,そこまでの距離を測るのに,三平方の定義ってあるじゃないですか。平方根が必要なんですね。でも(Flash4に)平方根がないんですよ。
で,平方根が取れないんで,ニュートン法っていう方法を使うんです。
平方根だけではなくて,色々な関数に適用できる近似値を出すための計算で,ループで計算するんですけど,ループ回数が精度に比例してくる。
で,自分に必要な精度まであればいいので,ループ回数をコントロールしちゃえば,すごく簡単な計算で平方根がだせるんですね。
その後Flash5くらいで,Mathが出て来て平方根が取れるってことになって,平方根に書き換えたら急に遅くなったんですね。
で,なんじゃい!?と。
──ほー,オレが書いた方が速いと。
小:そう。で,プログラム環境が進化してるにも関わらず,実行するファイルが遅くなる。
平方根を使った方が解りやすいんですけど,実は,プログラムを速くするには色々そう言う裏技みたいなのがあるんだということを,知りました。
で,プログラマーの人にちょっと話しを聞いたら「割り算を減らせ」と言うんで,割り算を減らしてみたんですけど,あんまり速くなんないんですよね。
たぶん,かけ算よりもややこしいルーチンでやってるから,(割り算が)遅くなると思うんですけども,(自分が作っている物の場合)あまり効果無いなと。
環境によって効果のあるものと効果の無いものがあって,で,その効果あるもう一つは,三角関数なんですよね。
『4D2Uナビゲーター』の場合は,その,三角関数を0.1度刻みのテーブルで組んでるんですよ。
──10だから,3600?
小:そんなテーブルをサインとコサインを組んでるんですね。
あるシーンでの角度が決まっちゃうと,そこで使う関数の数値って決まってくるんです。サイン×サインとかサイン×コサインっていう掛け算を何度もルーチンの中で使うので,それも一気に計算しておくんです。角度が決まったら,それを全部使うっていう風に。
関数をいかにコンパクトにまとめて省略かするかっていうのが速度にものすごく大きく影響して行くなっていうのがわかりました。
どうやって速度を計っているかっていうと,ストップウォッチで計ってるんですよ(笑)
──お,今回は速かったーみたいな?
小:そうそう。割り算省いたけど全然効かねーなーみたいなね(笑)
わざわざね,割り算を省くためにややこしい事やるぐらいだったら,割り算のままでいいやと。
──そうですねー。
小:ソースコードを見ると後で「何やってたんだ!」っていうことが結構あります。可読性と速くする裏技を使うののせめぎ合いみたいなところがあるんですよ。
で,速くするっていう時のネタとして,僕はあんまり使ってないですが,必要な精度を満たす範囲での関数の簡略化がありますよね。
重力多体問題っていうのを計算する人たちがいて,いわゆる物理学で天文の動きのシミュレーションとか,質量を持った小さな点が無数にある場合の振る舞いとかをシミュレーションで計算して,宇宙の秘密を解き明かそう,みたいなことをやってる人たちがいて,そういう,ものすごい膨大な計算をより速くするためのノウハウを知ってる人たちに話を聞くと「同じ事やってるな」っていうことが分かって。
小:例えば,関数をリニアに近似して間の値を埋めていくとか,そういう,すごく地道なやり方を積み重ねてカツカツなものができてるんだなっていうことがよくわかって,「あぁ,そういう苦労も大事だな」て思いました(笑)
小:やっぱりちょっと大変なんですよね。与えられているものをそのまま使うんではなくて,プログラム的には遠回りをする事になるから,結構めんどくさかったり,しんどかったりするんですけど,効果的な事があるんだなと。
結局Flashで何ができる,できないっていうのは,スピードの問題じゃないですか。逆にスピードを無視すれば,なんだってできるわけですよね。
──ですね。
小:ところが,それがコンテンツとして成り立つか,成り立たないかっていうのは,スピードとのせめぎ合いなんですよね。
だから「こんなことで,3日も4日も費やして俺は一体なんだろ」…みたいに思っちゃう事もあるんですけど…されどスピードなんですよ。たかがスピード,されどスピード。
小:ある限られた,CPUのスペックの中で何ができるかっていう,上限が決まってるからその中で何が出来るかってことを考えざるを得ないってことがあって,スピードってものすごい重要な要素ですよね。それで表現変わってきますもんね。

