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

Objective c 使用mach_absolute_time()减慢模拟速度。这是正确的方法吗?,objective-c,macos,cocoa,real-time,Objective C,Macos,Cocoa,Real Time,我正在为OSX编写一个应用程序(Obj-C/Cocoa),它运行模拟并向用户显示结果。在一种情况下,我希望模拟“实时”运行,这样用户就可以看到它以与现实生活中相同的速度运行。模拟以特定的时间步长dt运行。现在,我使用mach_absolute_time()来减慢模拟速度。当我分析这段代码时,我发现到目前为止,我的大部分CPU时间都花在mach_absolute_time()上,我的CPU固定在100%。我这样做对吗?我想如果我放慢了模拟的速度,使得程序在大部分时间里都没有模拟任何东西,那么CPU

我正在为OSX编写一个应用程序(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
         // ....
    }
}
你正在做。如果在你需要再次模拟之前还有很多时间,那就考虑睡觉


但任何睡眠都不能保证它能在指定的时间内完全睡眠。根据您希望的准确程度,您可以少睡一会儿,然后再转一转来转去。

完全不要转。

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

sleep()
nanosleep()
可以正常工作,但只能在主线程以外的其他线程上使用

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

如果您想让模拟在用户看来平滑,那么您真的需要将减慢的版本锁定到屏幕的刷新率。在iOS上,有。我不知道在Mac电脑上有没有直接的等价物。

谢谢,我现在使用nanosleep()来睡眠90%的预期等待时间。这给了10%的出错空间。完美并不是非常重要,但这似乎是一个体面的妥协。CPU使用率大幅下降。为此,CVDisplayLink()应该能够取代CADisplayLink。