CADisplayLink未在连续帧之间提供适当的时间间隔

时间:2017-01-19 07:43:42

标签: ios 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(double timeStamp)函数中

{

     mDeltaTime = timestamp - mLastTimeStamp ;

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

      mLastTimeStamp = timestamp ;

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

} 

在旧系统中打印正确的fps(29 - 30)(mac book pro,OS - Yosemite,XCode 7.1)。当我升级我的系统(OS-Sierra,XCode-8.2)时,值不合适。它在(2 fps到30 fps)之间变化很大,这破坏了我的游戏玩法。

我还根据我的deltaTime计算实现了一个变体 http://www.gamasutra.com/blogs/KwasiMensah/20110211/88949/Game_Loops_on_IOS.php#note9。 但它没有解决问题。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:2)

从您的帖子中,您似乎正在模拟器中尝试使用该应用。它在真实设备上是否也这样做? CADisplayLink在设备上比在模拟器上工作得更好。 另一件事:如果你想与显示帧率同步,你应该删除该行:

    mDisplayLink.preferredFramesPerSecond = 60 ;

最后,您可能需要检查Update / PreRender / Render代码。如果处理时间过长,您将跳过帧。