2012-04-09 189 views
8

我有一個GLKViewController來處理一些OpenGL繪圖。我已經執行了glkView:drawInRectupdate方法,並將preferredFramesPerSecond屬性設置爲30(默認值)。GLKViewControllerDelegate被阻止

問題是,當用戶與應用程序的其他部分交互時,委託方法停止觸發。我見過這種情況發生的兩種情況是當用戶滾動UITableView或與MKMapView交互時。

有沒有辦法確保這些代表總是有火,無論該應用的其他部分在做什麼。我希望這些停止的唯一時間是當應用程序進入後臺(這是自動執行的)。

+0

你能發表一些代碼嗎? – prince 2012-07-06 21:38:17

+0

沒有任何realavent代碼。在'GLKViewController' init中,我將'preferredFramesPerSecond'設置爲30. – 2012-07-07 21:17:28

回答

15

原因在於,在表格視圖或地圖視圖中滾動時,runloop位於UITrackingRunLoopMode,其優先級高於默認模式。這可以防止一些事件觸發以保證高滾動性能。

要解決您的問題,您必須設置您自己的渲染循環,而不是依靠GLKViewController

  • 首先設置GLKViewNOenableSetNeedsDisplay(使用GLKViewController當應自動設置)。
  • 設置preferredFramesPerSecond爲0(或者1)以禁止的GLKViewController渲染循環或不使用GLKViewController在所有
  • 導入QuartzCore框架:#import <QuartzCore/QuartzCore.h>
  • 創建一個CADisplayLinkNSRunLoopCommonModes安排它:
 
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
  • 可選的:的DisplayLink的frameInterval設置爲2(=幀率一半)
  • 渲染方法:
 
- (void)render:(CADisplayLink*)displayLink { 
    GLKView* view = (GLKView*)self.view; 
    [view display]; 
} 

我沒有測試過這一點,所以告訴我,如果它的作品!

+3

這是行得通的。我正在尋找一種我不需要這樣做的方式,但我認爲你是對的,這是唯一的出路。 – 2012-07-08 01:54:43

+0

出於某種原因,這會導致我的幀率降低到每幀2秒! – 2014-06-26 20:43:27

+0

@JosephHumfrey檢查CADisplayLink的frameInterval屬性(默認值= 1)。也許你錯誤地將它設置爲30?幀率應該等於'1 /(displayLink.frameInterval * displayLink.duration)' – Felix 2014-06-30 13:29:01