2012/08/16
iOS CADisplayLink とフレームレート
DisplayLink の描画呼び出しは基本的に 1/60 sec 単位で行われます。
わかりやすく言えば WaitVSync です。
処理が落ちが発生した場合も、次の VSync 相当のタイミングを待ってから
呼び出しが行われています。
そのため問題となっていたのが frameInterval を 2に設定した場合で、
当初この API で呼ばれるタイミングを勘違いしていました。
基本的に 2 frame に一度呼ばれますが、処理落ちが発生した場合は
次の VSync 相当のタイミングで呼ばれます。
上の (B) の動作となり、(C) や (D) にはならないようです。
わかりやすく言えば WaitVSync です。
処理が落ちが発生した場合も、次の VSync 相当のタイミングを待ってから
呼び出しが行われています。
そのため問題となっていたのが frameInterval を 2に設定した場合で、
当初この API で呼ばれるタイミングを勘違いしていました。
(A) (B) (C) (D) -------------------------------------------- frame 0 draw draw draw draw frame 1 frame 2 draw frame 3 draw draw frame 4 draw draw draw frame 5 draw frame 6 draw darw darw (A) = 処理落ちなし (B) = 処理落ちした場合の実際の動作 (C)/(D) = これは間違い
基本的に 2 frame に一度呼ばれますが、処理落ちが発生した場合は
次の VSync 相当のタイミングで呼ばれます。
上の (B) の動作となり、(C) や (D) にはならないようです。
2012/08/14
Xcode 4.4 と Objective-C property
知人がはまっていたバグ。
ようするに Property と思って代入したのに "self." が足りなかった
ため retain されていませんでした。
どれもコンパイルが通りますが上の 2つはメンバへの直接アクセスで、
3. だけ property のメソッドが呼ばれます。
Xcode 4.4 以降はメンバの宣言も @synthesize も書かなくて良くなっています。
簡単に書けますし、この時デフォルトで挿入される変数も "_p" となるため、
上の 1. 2. のようなミスもエラーで分かります。
次からは絶対 ARC にするともいってました。
@interface MyClass : NSObject { MyObj* p; } @property (retain) MyObj* p; @end @implementation MyClass @synthesize p; -(void)setp { p= value; // ← ここ ~ self.p= nil; } @end
ようするに Property と思って代入したのに "self." が足りなかった
ため retain されていませんでした。
1. p= value; 2. self->p= value; 3. self.p= value;
どれもコンパイルが通りますが上の 2つはメンバへの直接アクセスで、
3. だけ property のメソッドが呼ばれます。
Xcode 4.4 以降はメンバの宣言も @synthesize も書かなくて良くなっています。
簡単に書けますし、この時デフォルトで挿入される変数も "_p" となるため、
上の 1. 2. のようなミスもエラーで分かります。
// Xcode 4.4 以降 @interface MyClass : NSObject @property (retain) MyObj* p; @end @implementation MyClass -(void)setp { self.p= value; ~ } @end
次からは絶対 ARC にするともいってました。