как сделать события DispatcherTimer более плавными в WPF?
В моем приложении WPF пользователь нажимает кнопку для плавного вращения 3D-модели и отпускает кнопку, чтобы остановить вращение.
Для этого я создаю DispatcherTimer:
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler( timer_Tick );
timer.Interval = new TimeSpan( 0, 0, 0, 0, 30 );
И когда кнопка нажата, я звонюtimer.Start()
и когда кнопка отпущена, я звоню.timer.Stop()
timer_Tick
Функция изменения поворота модели:
void timer_Tick( object sender, EventArgs e )
{
spin = ( spin + 2 ) % 360;
AxisAngleRotation3D rotation = new AxisAngleRotation3D( new Vector3D( 0, 1, 0 ), spin );
Transform3D rotate = new RotateTransform3D( rotation );
model2.Transform = rotate;
}
Что я заметил, так это то, что модель вращается в большинстве случаев плавно, но часто зависает и заикается, делая паузу в течение разных периодов времени, иногда до 1/4 секунды.
Есть ли способ сделать это более гладким? Я понимаю, что с помощью DispatcherTimer (в отличие, скажем, от System.Timers.Timer) обратные вызовы происходят в потоке пользовательского интерфейса. Но это'Мне необходимо быть под угрозой пользовательского интерфейса, чтобы запустить линию
model2.Transform = rotate;
Я читал о различных способах получения обратного вызова таймера в другом потоке. Но, похоже, в конце концов мне нужно синхронизироваться с потоком пользовательского интерфейса, чтобы вызвать эту строку. Если я использую Invoke () для маршалинга, скажем, из потока обратного вызова System.Timers.Timer в поток пользовательского интерфейса, это даст более плавную анимацию? Кажется, это не должнот, так как этонеобходимо синхронизировать с потоком пользовательского интерфейса точно так же, как это делает DispatcherTimer. И в этом отношении кажется, чтолюбой схема для настройкиmodel2.Transform
на регулярной основе будет в той же лодке по отношению к потоку пользовательского интерфейса, нет?
(Как возможно вторичный вопрос, япытаюсь понять чтоS вызывает паузы в первую очередь. Насколько я знаю, тамНичего более существенного, что делает поток пользовательского интерфейса. Так что я нене понимаю, чтопроисходит во время этих пауз. Вывоз мусора? Это нене должно быть много мусора, и это некажется, что пауза была бы такой чрезвычайной.)