2012-02-05 20 views
2

我正試圖在常規(非OpenGL)iPhone應用程序的每一幀中執行一小段代碼。我們的目標是擁有一個框架計數器,以便我可以測量(而不是猜測)應用程序中的緩慢點,並修復它們以創建更好的用戶體驗。在跟蹤UIScrollView時,沒有爲每幀執行的NSRunLoopCommonModes的CADisplayLink?

什麼我目前做的是註冊一個CADisplayLink所有模式(包括跟蹤):

CADisplayLink *displayLink = [[CADisplayLink displayLinkWithTarget:self selector:@selector(frame)] retain]; 
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 

時執行這個樣子的(lastDraw是的NSDate *和算一個int)的代碼:

- (void) frame { 
NSDate *newDate = [NSDate date]; 

if([newDate timeIntervalSinceDate:lastDraw] >= 1) { 
    label.text = [NSString stringWithFormat:@"%d FPS", count]; 

    count = 0; 
    [lastDraw release]; 
    lastDraw = [newDate retain]; 
} 

count++; 
} 

這裏的想法是讓一個更新每隔一秒爲多少幀在過去的第二繪製。

這似乎工作正常,但在UIScrollView中滾動時數字肯定是關閉的:如果我只是像普通人一樣滾動,那麼幀率似乎有意義。但是,如果我大幅上下滾動,則顯示的速率會下降到1或2 fps,但很明顯,每秒鐘只會畫出更多的幀。

當我改變幀方法類似這樣:

- (void) frame { 
    label.text = [NSString stringWithFormat:@"%f", displayLink.timestamp]; 
} 

它變得很明顯,極少數事件被觸發,當我滾動。

我已經閱讀了大量的文章,並在網絡上處理UIScrollViews和NSRunLoopCommonModes與NSDefaultRunLoopMode,但還沒有發現有人描述我的問題。我發現的最接近是在這個question

請記住,如果一個CADisplayLink不能火了屏幕刷新(由於主線程忙做這樣的事情畫上一幀),則可以跳過它,它沒有足夠的時間來完成。

我似乎無法找到任何證據,在官方documentation,雖然和希望,我做錯了什麼......

如果它使有問題的設備運行任何區別iOS 4.3.3。

+0

如果您將顯示鏈接添加到'UITrackingRunLoopMode'以及'NSRunLoopCommonModes'之後會發生什麼? – 2012-02-05 19:22:52

+0

感謝您的建議,不幸的是它沒有幫助:// '[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];' – 2012-02-05 21:30:15

回答

1

我使用Apple在票#10848893在http://bugreport.apple.com/驗證了這一點,它似乎確實是一個在iOS 5.1種子3中修復的錯誤,我無法重現該問題。