La.系ぶろぐ

個人的いろいろメモ。シャープペンのメモにちょっぴりゲ○ツの悪口が混じってるただのチラ裏。

flashのコールバックではまりますた……

たまにはPGネタでも書くか。
てか、ネットだと、成功例とかの情報は引っかかりやすいけど、失敗談とかは見つかりにくいので。
てことで、今回はflashのDisplayObject周りの話。

自分が最近までflashに触らない人間だったので(てか、この手の言語ってrubyくらいしか触ってなかった)
軽くイメージできるように書いておくと、
flashの表示周りライブラリって、大抵ルートのオブジェクトがあって、
そこに表示物をノード(ツリー)としてぶら下げていく処理になっています。
で、画面更新時はonEnterFrameってメソッドを作っておいて、子ノードの同じメソッドを巡回。
なんか効率悪そうに感じますが(C脳としては)
メモリアクセス量さえそこそこに収まっていれば、CPU処理は隠蔽できるので、それなりの早さになるって感じなんですかね?

で、何にはまったかというと、
表示物にコールバック処理が2~3個あって、その最後のコールバックが来ない。
もしかして、途中のコールバックや裏タスクで、コールバック処理がキャンセルされてる?と思って、確認したけど、削除されてる形跡はない。
なんでー、と色々調べてやっと分かったのが……

大本のオブジェクトが、表示リストに登録されてなかった。(ちゃんちゃん)

上で解答をそのまま書いてる感じですが、コールバックって割り込みでも何でもなく、親ノードからの巡回なので、
ノードに登録されてないと処理が回ってこないのです。
で、何で勘違いしたのかというと、
・表示されてない(=休止状態の)オブジェクトだけど、オブジェクトの変数を(デバッグで)見ても、活性状態と区別が付かない
・途中のコールバックはちゃんと生きている
で、なんで途中の処理が通ってるか、と言うと、このコールバックは別の表示オブジェクトなんですね。(ややこすい)

表示オブジェクトは、大抵親がたどれるようになっているので、まあ……コールバック登録時にエラーでチェックできるのですが。
でも、このオブジェクト、継承が複数されてて、親の親、辺りが表示リストに接続される感じなんですよ。
エラーチェックで回避は悪手だよな……これ……

まー、なんでこんな話をしてるのかというと、ここからどんな教訓(回避策)を得るべきなのか、って話なのですが。

ぶっちゃけ、大本の話として、
・実は引き継ぎ案件なので、構造を余り理解してない
ってのがあります。じゃあ、引継ぎの問題だから聞けばいいじゃん、ってなると思いますが……
うーん、担当者ももう離れて時間経ってるし、アレだよな……って感じだったり。
てっか、そもそも、引継ぎのたびに、こんな質問投げ合ってたら大変です。
もっとスマートに解決しようず、と思うわけで。

だから、たぶん、
・実装で工夫しる!(てか素直な実装?にする)
・言語知識の不足がそもそも問題!
って辺りで解決するべきかな……とは思うのですが。

てかさー、flashとか、こう何でもobjectって感じは慣れるとあまり設計に詳しくなくても何となくいじれちゃう感じがすがすがしかったりするレベルなのですが、
でも、なんかすごく無駄も多いですよねー。
富豪プログラムここに極まれり、というか。

オブジェクトの生き死にも無頓着になっちゃうし、
(まあ、後始末の時は、神経質にnull突っ込みまくって、参照を切るわけですが……;)
そもそも、あまりオブジェクトを丁寧に殺してると、GCばんばん来ちゃうので、使い回そうずって話があったり、
すると、上みたいな現象もがんがん起きちゃうわけです。
(オブジェクトの生き死にがわかんなかったり、使い回しで破綻が起きたり、とか)

とはいえ、大昔、インテルさんのペンティアムとかペンプロ(2じゃなくw)の説明会みたいなのがあって(あ、MMXだったかも)
Javaなどのインタプリタ系言語を高速化するぜ!と言ってて(ネットバーストになるのかな?)
当時は何それ?pgrって感じだったのですが、
まー、考えて見れば、CPU速度とメモリ速度が乖離すると、インタプリタ系のオーバーヘッドも隠蔽できるし、
そうすればインタプリタで富豪プログラム、うはうはじゃん、って今の状況を見据えてはいたんですね……
(JavaScriptとかででCに勝つる!とか見てらんないって感じだけど、良い勝負できちゃうこともあるんですよね……)
CPU技術者の先見の明には関心というか、頭が下がるというか……ではあるのですが、
でも、地球に優しくないよなーとも思うわけで。(ぇ

なんか話が逸れました。
まー、結局、まだこの手の言語の、こういうバグ回避のノウハウは、個人的には余り溜まって無くて。
たぶん、デザパタなり、flashの定石なりがあって、禁じ手とかもある(その辺を守ってれば回避できて当然とか)とは思うんですけどね。
でも、flashって情報が思いの外たくさん引っかかる……割に、細かいことは分かりにくいですよね……
うむむ。

まー、一般的に役立つ失敗談かどうかよくわかんなくてごめんなさい:P

スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する