2011-01-11 1 views
0

Я хотел бы получить информацию о анимации в WPFМОФ анимация с WinMM

, потому что мне нужен очень точный рендеринг, я решил использовать мультимедийный таймер вместо таймера анимации по умолчанию ...

Так Я хотел бы знать, как работают часы анимации ... Я думал о том, чтобы поднимать событие галочки каждые 2 мс и вызывать диспетчерский вызов (я не уверен, что интервал 2 мс достаточен для перемещения строки, но если мое понимание хорошее, диспетчер справится с этим, нет??

public void setTime(int TimeInMs) 
     { 
     AnimatedLine.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal, 
     new Action(
      delegate() 
      { 
       AnimatedLine.X1 = TimeInMs/10 * ZoomRatio; 
       AnimatedLine.X2 = TimeInMs/10 * ZoomRatio; 
      } 
     )); 

это лучший способ сделать это?

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

На данный момент, я действительно думаю, что это невозможно в цикле коллекцию каждые 2мс (например, из 100 объектов), так что я вы решили использовать словари ... (используя ключ как ссылку времени), если есть лучший вариант, я буду рад услышать ...

ответ

2

Не делайте этого. Если основной поток не может справиться с модификацией + повторной визуализации, Actions будет складываться в Dispatcher, пока не произойдет что-то действительно плохое.

Вместо этого взгляните на CompositionTarget.Rendering. В принципе, это событие увеличивается один раз за кадр, поэтому вы можете анимировать свои объекты в нем перед рендерингом.

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

В любом случае это хорошая практика анимации.

+0

Я действительно не понимаю ... Диспетчер не предназначен для решения этой проблемы? самые важные вещи для анимации - это то, что она отлично синхронизируется с таймером MultiMedia, как часы, я пытаюсь использовать диспетчер-таймер, но он не может обрабатывать точность часов, кстати, он потерял почти 1 секунду каждый 10, в зависимости от заряда процессора /// – guillaume

+0

Если вы накладываете частоту кадров в систему рендеринга (в вашем случае 1 кадр каждые 2 мс, или 500 кадров в секунду), у вас будут проблемы, если он не справится с этим. Если вы устанавливаете 500 операций в секунду в диспетчере, и он может обрабатывать только 100 действий в секунду, очередь будет продолжать расти, и ваша анимация будет выглядеть странно. Итак, не налагайте частоту кадров, а не анимируйте свои объекты на основе времени, прошедшего с момента последней анимации. –

+0

Хорошо спасибо, это совершенно разумно и работает! но мне нужно удалить событие CompositionTarget.Rendering, если TimeValue не изменяется (потому что я получаю это значение для каждого кадра) – guillaume

Смежные вопросы