Использование Mach absolute time() для замедления моделирования. Разве это правильный путь?



Я пишу приложение для 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
// ....
}
}
648   2  

2 ответов:

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

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

Не крутитесь вообще.

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

sleep() или nanosleep() можно заставить работать, но только при использовании на чем-то другом, кроме основного потока.

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

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

Comments

    Ничего не найдено.