Предотвращение заикания WPF / пропущенных кадров - PullRequest
2 голосов
/ 22 февраля 2010

Я написал простое игровое приложение в WPF. Количество нарисованных объектов находится в пределах возможностей WPF - что-то вроде нескольких сотен эллипсов и линий с простыми заливками. У меня есть DispatcherTimer, чтобы время от времени корректировать положение объектов (1/60 секунды).

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

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

Могу ли я каким-то образом заставить WPF отразить изменения на визуальном экране на экране, независимо от того, считает ли WPF, что это хорошая идея?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2010

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

Единственное, что, я думаю, вы могли бы попробовать, это сдвинуть приоритет Диспетчера вашего кода движения немного ниже Render (Loaded - следующий вниз), используя что-то вроде:

this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, MoveMyStuff);

У меня нет какого-либо тестового комплекта, чтобы проверить, поможет ли это.

0 голосов
/ 10 июня 2010

Эта проблема была исправлена ​​с помощью Canvas с переопределением OnRender вместо создания и перемещения элементов UIE. Это означает, что все должно быть нарисовано вручную в OnRender, но теперь он может работать на любом FPS последовательно, без пропуска кадров.

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