这是我的第一篇文章。如有任何错误,请耐心等待。
我是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。 但它没有解决问题。
任何建议都会有所帮助。
答案 0 :(得分:2)
从您的帖子中,您似乎正在模拟器中尝试使用该应用。它在真实设备上是否也这样做? CADisplayLink在设备上比在模拟器上工作得更好。 另一件事:如果你想与显示帧率同步,你应该删除该行:
mDisplayLink.preferredFramesPerSecond = 60 ;
最后,您可能需要检查Update / PreRender / Render代码。如果处理时间过长,您将跳过帧。