8

OpenGL の描画を処理する GLKViewController があります。メソッドとメソッドの両方を実装し、glkView:drawInRectプロパティを 30 (デフォルト) に設定しています。updatepreferredFramesPerSecond

問題は、ユーザーがアプリの他の部分と対話するときにデリゲート メソッドの起動が停止することです。これが発生する 2 つのケースは、ユーザーが UITableView をスクロールするか、MKMapView を操作する場合です。

アプリの残りの部分が何をしているかに関係なく、これらのデリゲートが常に起動するようにする方法はありますか? これらを停止したいのは、アプリがバックグラウンドに入るときだけです(これは自動的に行われます)。

4

1 に答える 1

15

これは、テーブル ビューまたはマップ ビューでのスクロール中に、ランループがUITrackingRunLoopModeデフォルト モードよりも優先度が高いためです。これにより、高いスクロール パフォーマンスを保証するために、一部のイベントが発生しなくなります。

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

  • toenableSetNeedsDisplayの最初のセット(GLKViewController を使用する場合は自動的に設定されます)。GLKViewNO
  • GLKViewController のレンダリング ループを無効にするか、GLKViewController をまったく使用しない場合はpreferredFramesPerSecond、0 (または 1) に設定します。GLKViewController
  • QuartzCore フレームワークをインポートします。#import <QuartzCore/QuartzCore.h>
  • を作成し、CADisplayLinkでスケジュールしNSRunLoopCommonModesます。
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  • オプション: displayLink の frameInterval を 2 (= フレームレートの半分) に設定します。
  • レンダリング方法:
- (void)render:(CADisplayLink*)displayLink {
    GLKView* ビュー = (GLKView*)self.view;
    [ビュー表示];
}

私はこれをテストしていないので、動作するかどうか教えてください!

于 2012-07-07T21:52:29.927 に答える