Использование mach_absolute_time () для замедления симуляции. Это правильный путь? - PullRequest
2 голосов
/ 17 ноября 2011

Я пишу приложение для OS X (Obj-C / Cocoa), которое запускает симуляцию и отображает результаты для пользователя. В одном случае я хочу, чтобы моделирование выполнялось в режиме «реального времени», чтобы пользователь мог наблюдать, как он проходит с той же скоростью, что и в реальной жизни. Симуляция выполняется с определенным временным шагом, dt. Прямо сейчас я использую mach_absolute_time (), чтобы замедлить симуляцию. Когда я профилирую этот код, я вижу, что большая часть времени моего процессора тратится в mach_absolute_time (), а мой процессор привязан к 100%. Я делаю это правильно? Я подумал, что если я замедляю симуляцию так, что программа большую часть времени ничего не симулирует, то загрузка ЦП должна быть снижена, но 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 ]

5 голосов
/ 17 ноября 2011

Не вращаться вообще.

Это первое правило написания приложений с графическим интерфейсом, где важны время автономной работы и отзывчивость приложений.* можно заставить работать, но только в том случае, если он используется в чем-то отличном от основного потока .

Лучшее решение состоит в использовании любых конструкций на основе времени в GCD, посколькуболее эффективное использование системных ресурсов.

Если вы хотите, чтобы моделирование выглядело плавно для пользователя, вам действительно нужно привязать замедленную версию к частоте обновления экрана.На iOS есть CADisplayLink .Я не знаю прямого эквивалента на Mac.

3 голосов
/ 17 ноября 2011

Вы делаете занят вращением .Если у вас есть много времени, прежде чем вам нужно снова смоделировать, рассматривая вместо этого сон.

Но любой сон не гарантирует, что он будет спать именно в течение указанной продолжительности.В зависимости от того, насколько точным вы хотите, чтобы вы были, вы можете спать немного меньше, а потом вращаться для отдыха.

...