私はCADisplayLinkに大きな問題を認識しました。CADisplayLinkを正しく停止して再開する方法は?
私は、テストのために回転する三角形を描画するOpenGL ES 1.1でもっとも基本的なEAGLLayerを持っています。これは、画面のリフレッシュレートで呼び出される実行ループ方式を必要とするので、私はこのように実行ループを開始します。
- (void)startRunloop {
if (!animating) {
CADisplayLink *dl = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
[dl setFrameInterval:1.0];
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = dl;
animating = YES;
}
}
- (void)stopRunloop {
if (animating) {
[self.displayLink invalidate];
self.displayLink = nil;
animating = NO;
}
}
テストアプリが起動し、私は-startRunloopを呼び出します。 画面をタップすると、-stopRunloopが呼び出されます。 もう一度タップすると、-startRunloopが呼び出されます。その他卓球。
私は20秒で-drawFrameメソッドが呼び出される頻度を測定しています。
FIRSTの開始/停止サイクルは常に100%で実行されます。私は最大のフレームレートを取得します。
すべての後続開始/停止サイクルは、パフォーマンスの約80%しか示していません。私はかなり小さいフレームレートを取得します。しかし、常にほぼ正確に+/- 2フレーム。さらに50回の起動/停止サイクルを経てもさらに劣化する傾向はありません。結論として
:それは無効または一時停止されるまで私は上記のように行うCADisplayLinkの作成は、罰金です。その後、新しいCADisplayLinkはそれ以上はうまく機能しません。たとえそれが以前とまったく同じように新しく作られたとしても。 YES/NOを指定して-setPaused:メソッドを呼び出すことで、一時停止/再開する場合も同じです。
割り当てやVMトラッカーインストゥルメントでは、メモリ管理の問題がないことを確認しました。また、CADisplayLinkの-invalidateメソッドが実際に呼び出されたことを確認しました。
端末(iPhone 4)のiOS 4.0。
なぜですか?何か不足していますか?
これを試してみてください。あなたはAppleにバグレポートを提出する必要があると思います。 –
私は同じ問題があります。 DisplayLinkはいつも動く必要はありませんが、私は選択肢がないようです。今はisPausedを使用する代わりにハンドラセレクタでフラグを使用しています。 –