我正試圖在常規(非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。
如果您將顯示鏈接添加到'UITrackingRunLoopMode'以及'NSRunLoopCommonModes'之後會發生什麼? – 2012-02-05 19:22:52
感謝您的建議,不幸的是它沒有幫助:// '[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];' – 2012-02-05 21:30:15