2012-04-09 10 views
8

私はGLKViewControllerを使っていくつかのOpenGL描画を処理しています。 glkView:drawInRectupdateの両方のメソッドが実装されており、preferredFramesPerSecondプロパティが30(デフォルト)に設定されています。GLKViewControllerDelegateがブロックされています

問題は、ユーザーがアプリケーションの他の部分とやりとりしたときに、デリゲートメソッドが起動しなくなることです。この2つのケースは、ユーザーがUITableViewをスクロールしたり、MKMapViewとやりとりするときに発生します。

これらのデリゲートを確実に確認する方法はありますか?常にはアプリケーションの残りの部分が何であるかにかかわらず発生します。私がこれらを止めることができる唯一の時間は、アプリがバックグラウンドに入るときです(これは自動的に行われます)。

+0

コードを投稿できますか? – prince

+0

realaventコードはありません。 'GLKViewController' initでは' preferredFramesPerSecond'を30に設定しました。 –

答えて

15

これは、テーブルビューまたはマップビューでのスクロール中にrunloopがデフォルトモードよりも優先度が高いUITrackingRunLoopModeにあるためです。これにより、高いスクロール性能を保証するために、いくつかのイベントが発生することを防ぎます。

問題を解決するには、GLKViewControllerに頼るのではなく、独自のレンダリングループを設定する必要があります。

  • まず(GLKViewControllerを使用するときに自動的に設定されるべきである)NOGLKViewenableSetNeedsDisplayのセット。
  • QuartzCoreフレームワークをインポートGLKViewControllerのレンダリングループを無効にするか、すべての
  • でGLKViewControllerを使用していない0(または多分1)にpreferredFramesPerSecondを設定します。#import <QuartzCore/QuartzCore.h>
  • CADisplayLinkを作成し、NSRunLoopCommonModesでそれをスケジュール:
 
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
  • オプション:2にDisplayLinkのframeIntervalの設定(=ハーフフレームレート)
  • 方法レンダリング:私はこれをテストし、それが動作するかどうかを教えていない
 
- (void)render:(CADisplayLink*)displayLink { 
    GLKView* view = (GLKView*)self.view; 
    [view display]; 
} 

は!

+3

これは動作します。私はこれをする必要がない方法を探していましたが、これが唯一の方法だとあなたは正しいと思います。 –

+0

なんらかの理由で、フレームレートがフレームあたり2秒に低下します。 –

+0

@JosephHumfrey CADisplayLinkのframeIntervalプロパティをチェックします(デフォルト= 1)。間違って30に設定したのかもしれませんか?フレームレートは '1 /(displayLink.frameInterval * displayLink.duration)'と等しくなければなりません。 – Felix

関連する問題