WPF: лучший (надежный) способ перевести (переместить) холст и монитор каждый шаг - PullRequest
1 голос
/ 26 февраля 2009

Я пытался перевести (переместить) холст, но у меня проблемы с таймерами.

Я пробовал 2 разных метода:

Первый метод был с функцией BeginAnimation, а второй с DispatcherTimer тиками, но оба они очень ненадежны.

Мне нужно следить за каждым шагом перевода. Первым методом, который я попробовал (BeginAnimation), я применил логику обнаружения столкновений в событии Changed, а вторым методом (DispatcherTimer) я выполняю логику обнаружения столкновений в событии Tick таймер.

Проблема в том, что оба они очень ненадежны. В том смысле, что в моей логике обнаружения столкновений холст должен прекратить трансляцию, когда его свойство TranslateTransform Y равно <= 0 (технически, если он отслеживает каждый шаг, он должен каждый раз останавливаться на 0), но с обоими методами, которые я пробовал, <strong>меняется , когда останавливается. Например, иногда он останавливается на 0, иногда на -1, -2, -3, а иногда даже на -4 .

Так что с расхождениями? Почему он не следит за каждым шагом, как должен?

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2009

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

Конечный результат - это то, что вы видите, иногда вы можете получить обратный вызов после перемещения на 1/2 пикселя, потому что все прошло гладко, в следующий раз, когда два пикселя сместятся, потому что GC сработал в середине кадра, и время после этого это перемещение на 4 пикселя, потому что Word, работающий в фоновом режиме, украл несколько циклов ЦП для запуска заклинания chekcer.

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

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

0 голосов
/ 26 февраля 2009

Вы должны подключиться к событию CompositionTarget.Rendering .

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...