Archives

August 2012 の記事

DisplayLink の描画呼び出しは基本的に 1/60 sec 単位で行われます。

わかりやすく言えば 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) にはならないようです。


知人がはまっていたバグ。

@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 にするともいってました。