SSブログ

Magiquand (10.6+ Beta 0.9)のバグ [OpenCV関係]

昨日のベータ版Magiquandについて、昨日平林さんから動作しないとのコメントを頂いて、そのあともう一度見ていただいた。その結果、
  • カメラ画像のみ表示される
  • Windowをリサイズするとパーティクルが表示されるようになる
  • それ以降は最初から表示されるようになる
ということのようである。アプリはuser defaultsなどの保存はしていないので、アプリを立ち上げ直せば同じ状況で立ち上がるはずで、バグとしては一番困った種類のもの。しかし実は、そういうことはあるのではないか、とは思っていた。

カメラ画像は表示されているのでCALayerそのものの問題ではない。なぜならカメラ画像も、普通のNSViewのdrawRect:メソッドで表示するのではなく、CALayerを使って表示している。drawRect:はからっぽだし、試しにdrawRect:にブレークポイントを置いて待っていてもカメラの表示が始まると呼ばれなくなることは確認した。ちなみに僕の娘がMacBook Proの10.7なので試させたら、何事もなく動いたとのメールが返ってきた。

僕があまりCore Animationに慣れていないのでおかしな書き方をしているのかもしれない。でもCALayerを使うと、初期設定をしてしまえばフレームごとに何かするというようなことはなくなって放っておけば表示は進んでしまう。したがってアニメーションを扱うアプリによくあるタイミングの問題は存在しない。

でも、CALayerにまつわる、ちょっとなんかへんだな、という動作はこのアプリを書いてるときによくであった。たとえば、Programing GuideにはOS XのNSViewは何もしないとCALayerを使うことはできなくて
  • NSViewのsetWantsLayer:メソッドを呼ぶ
  • Interface BuilderでCALayerを使うNSViewの「Core Animation Layer」にチェックを入れる
のどちらかをすればいい、と書いてあるけど、少なくとも僕のiMacではその両方をやらないとCALayerの表示は始まらずにdrawRect:が呼ばれ続ける。

また、GuideにはCALayerの初期座標に関してあまり記述がない。デフォルトでどうなっているかわからないので、いちいちframeプロパティとpositionプロパティを設定して必ずNSViewの原点と一致させるようにした。にもかかわらず、CALayerのanchorPointが原点になっているとしか思えない動作をすることがあった。コンパイルし直すだけでその動作が変わる気もして、原点が移動する条件がまだよくわからない。

Core Animationは最初にOS Xに導入されたんだけど、iOSでいろいろ拡張されて、それがOS Xに逆輸入されたかたちで現時点ではiOSとOS Xとで同じメソッドが使えることになっている。が、表示の実体であるOS XのNSViewとiOSのUIViewで動作が違っている。NSViewはAppKitの表示の概念と両立させるためにモードの切り替えのようなこと(setWantsLayer:メソッドを呼ぶことで)をするんだけど、UIViewはそういう余計なことがないのでずっとシンプルになっている。

いや、OS XのCALayerに責任があると言っているわけではない。しかしNSViewとの関係でどこかつじつまの合わないところがあるんではないか、とも思えてくる。プログラマとしてはそれも「仕様」だと考えて対応しないといけない。一番困るのはその「つじつまの合っていないところ」をプログラマが探さないといけない、ということである。

最近ではOS XよりもiOSのプログラマの方がずっと多いし、AppleもiOSのほうに重点を置いているように見える。僕はiOS特有の面白さはあるかもしれないけど、やはりハードの制限が大きいせいで窮屈に思えるのと、今僕がやりたいことはどちらかといえばiOSよりもOS Xのほうにふさわしいので、やっぱり僕にはOS Xに書く方がずっと面白いと感じる。

しかしどうも最近AppleはOS Xに別の窮屈さを持ち込もうとしているように思える。まあ、その話はまた今度にして、とりあえずこのバグを取ってMagiquandのバージョン1.0をまず目指そう。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立09/23献立09/24 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。