2017-01-19 80 views
0

它是我的第一篇文章。任何錯誤,請與我聯繫。CADisplayLink沒有提供連續幀之間的適當時間間隔

我是iPhone開發新手。我正在使用CADisplayLink執行我的遊戲的「更新」循環。在XCode 8.2中,我使用以下代碼來計算兩個連續幀之間的deltaTime。

裏面我AppDelegate.mm文件

{ 
    mDisplayLink = [CADisplayLink displayLinkWithTarget: self selector:@selector(gameLoop)]; 
    mDisplayLink.preferredFramesPerSecond = 60 ; 
    [mDisplayLink addToRunLoop :[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

裏面我gameLoop()函數

{ 
    if (mDisplayLink==NULL) return; 
    mApp->CoreLoopUpdate((double)mDisplayLink.timestamp); 
} 

裏面我CoreLoopUpdate(雙時間戳)功能

{ 

    mDeltaTime = timestamp - mLastTimeStamp ; 

    if(mGame->IsInitialized()) 
    { 
      Update(mDeltaTime); 
      PreRender(mDeltaTime); 
      Render(mDeltaTime); 
     } 

     mLastTimeStamp = timestamp ; 

    std::cout<<"\nFPS : " << 1.0/mDeltaTime ; 

} 

它打印正確的FPS (29 - 30)在我的舊系統(mac書專業版,操作系統 - 優勝美地,XCode 7.1)。當我升級我的系統(OS - Sierra,XCode - 8.2)時,值不合適。它在(2 fps到30 fps)之間劇烈變化,這會破壞我的遊戲。

我也根據 http://www.gamasutra.com/blogs/KwasiMensah/20110211/88949/Game_Loops_on_IOS.php#note9對我的deltaTime計算實施了一項變更。 但它沒有解決問題。

任何建議都會有幫助。

回答

0

從你的文章看來,你似乎是在模擬器中嘗試你的應用程序。它是否在真實的設備上也一樣? CADisplayLink在設備上比在模擬器上更好地工作。 另一件事:如果你想與顯示器的幀速率同步,您應該刪除該行:

mDisplayLink.preferredFramesPerSecond = 60 ; 

最後,你可能要檢查你的更新/在PreRender /渲染代碼。如果處理時間過長,則會跳過幀。

+0

對不起,我離開車站2周。非常感謝你的幫助 。根據您的反饋,我在設備上檢查了它。它工作正常。再次感謝。 –