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

时间:2011-11-17 16:23:08

标签: objective-c macos cocoa real-time

我正在编写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
         // ....
    }
}

2 个答案:

答案 0 :(得分:5)

根本不要旋转。

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

可以使

sleep()nanosleep()正常工作,但仅在主线程以外的其他地方使用。

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

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

答案 1 :(得分:3)

你正在做 busy spinning 。如果有很多时间需要再次模拟考虑睡觉而不是。

但任何睡眠都不能保证它会在指定的持续时间内完全睡眠。根据你想要的准确程度,你可以少睡一会儿,然后旋转休息。