2014-02-27 31 views
0

我正在嘗試使用CADisplayLink來調用MoveObjects函數來動畫某些UIImageViews在頁面上「向下」。但是,儘管函數調用時間間隔爲0.0155-0.017,但動畫似乎每隔幾幀都會出現結尾,這與我嘗試使用NSTimer來調用該函數時的方式相同。有什麼我做錯了,這是讓它結結巴巴?使用CADisplayLinkLink時出現口吃動畫

viewDidLoad

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop)]; 
displayLink.frameInterval=1; 
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 

目前gameloop pnly調用UpdateObjects:

-(void)updateObjects{ 
    timeStamp=[displayLink timestamp]; 
    double frameTime=timeStamp-oldTime; 
    oldTime= timeStamp; 
    if (frameTime>10){ 
     frameTime=0; 
    } 
    NSLog(@"%f",frameTime); 

    for (int i=0; i<objectsArray.count; i+=1) { 
     UIImageView *currentObject=[objectsArray objectAtIndex:i]; 
     CGRect currentObjectFrame=[currentObject frame]; 
     [currentObject setFrame:CGRectMake(CGRectGetMinX(currentObjectFrame), CGRectGetMinY(currentObjectFrame)+200*frameTime,CGRectGetWidth(currentObjectFrame) , CGRectGetHeight(currentObjectFrame))]; 
    } 
} 
+0

對於秋季運動不使用CAAnimation或UIKitDynamics的任何理由? –

回答

1

一對夫婦的想法:

  1. 我很驚訝,你看到的口吃,你真的沒有看到任何偏離0.0155-0.017s區間。我會仔細檢查一下。我期望每個口吃者都會看到次優的時間間隔。

  2. 當在運行循環調度的東西,你可能會考慮使用NSRunLoopCommonModes,這比超過NSDefaultRunLoopMode一點更廣闊。取決於你還在做什麼,這可能會影響性能。

  3. 我不相信這是一個問題在這裏,但你應該警惕,包括整數表達式(如200,而不是200.0f)計算浮點值的時候,因爲有時的隱式轉換可能會導致怪異的四捨五入問題,這如果計算手動動畫的屏幕座標可能會導致動畫出現奇怪的不連續性。

  4. 就一般圖像動畫問題而言,以下任何情況都可能導致次優的響應時間:使用具有透明度值的圖像;需要調整大小以顯示在圖像視圖中的圖像;使用任何圖層效果,特別是基於貝塞爾的陰影;過多數量的圖像;等等。

  5. 顯然,我希望你在物理設備上而不是模擬器上進行測試,因爲模擬器不能準確反映實際的設備圖形性能。

儘管如此,我也很難調和,你看到與你永遠看到的間隔大於0.017秒索賠口吃的事實。如果是這樣的話,那會導致我懷疑一些舍入相關的問題(在框架中引入一些不連續的值框架),但我在這裏沒有看到任何這樣的問題。

+0

感謝您的建議,這非常有用。我所發現的時間間隔(被稱爲'moveObjects'的時間間隔)在最高時會上升到0.0176s,但答案可能在5號(對不起)。我不認爲我有辦法在物理設備上運行它,所以我將這個答案標記爲已回答,我只需要希望這是一個模擬器問題。再次感謝,五個優點。 – user3361405

+0

這不是一個解決方案,但第3點幫助我改進了我的項目中的其他幾個方面。 – Adobels