2017-01-19 32 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周。非常感谢你的帮助 。根据您的反馈,我在设备上检查了它。它工作正常。再次感谢。 –