使用mach_absolute_time()减慢模拟速度.这是正确的方法吗?

Bra*_*bie 2 macos cocoa real-time objective-c

我正在编写OS X(Obj-C/Cocoa)的应用程序,它运行模拟并将结果显示给用户.在一种情况下,我希望模拟以"实时"运行,以便用户可以以与现实生活中相同的速度观看它.模拟以特定的时间步长dt运行.现在,我正在使用mach_absolute_time()来减慢模拟速度.当我分析这段代码时,我发现到目前为止,我的大部分CPU时间都花在了mach_absolute_time()上,而我的CPU固定在100%.我这样做了吗?我想如果我放慢模拟速度以致程序在大多数时间没有模拟任何东西那么CPU使用率应该下降但是mach_absolute_time()显然不是"免费通话"所以我觉得可能有更好的方法?

double nextT = mach_absolute_time();
while (runningSimulation)
{
    if (mach_absolute_time() >= nextT)
    {
         nextT += dt_ns;
         // Compute the next "frame" of the simulation
         // ....
    }
}
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 5

根本不要旋转.

这是编写GUI应用程序的第一条规则,其中电池寿命和应用程序响应性很重要.

sleep()或者nanosleep()可以使其工作,但只有在主线程之外的其他东西上使用.

更好的解决方案是在GCD中使用任何基于时间的构造,因为这将更有效地利用系统资源.

如果您希望模拟对用户显得平滑,您真的想要将慢速版本锁定到屏幕的刷新率.在iOS上,有CADisplayLink.我不知道Mac上有直接的等价物.

  • CVDisplayLink(http://developer.apple.com/library/mac/#documentation/QuartzCore/Reference/CVDisplayLinkRef/Reference/reference.html)应该能够替换CADisplayLink用于此目的. (3认同)