Разрыв видео WPF на Windows XP - PullRequest
       33

Разрыв видео WPF на Windows XP

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

Я создал приложение WPF с использованием C #, которое отображает около 50 трехмерных элементов и анимирует камеру для перемещения по сцене.

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

Мне хорошо известна стандартная причина разрыва, то есть приложение обновляет кадры с частотой, отличной от вертикальной синхронизации монитора / адаптера.

Я также читал, что частота обновления экрана по умолчанию в WPF составляет 60 кадров в секунду, а в XP WPF обновления без учета montior v-sync .

Для некоторых сцен разрыв менее заметен, но часто он достаточно отвлекает, чтобы быть реальной проблемой.

Я действительно надеюсь, что есть разрешение, ведь Windows Forms годами имела двойную буферизацию. Переход к WPF на самом деле является шагом назад для многих типов приложений, если разрешение отсутствует.

Итак, как в Windows XP настроить WPF для удаления разрывов?

Я ищу более полезные ответы, чем "перейти на Vista". Это просто невозможно для многих будущих пользователей этого приложения.

1 Ответ

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

Ответов пока нет, конечно, с количеством разработчиков WPF, кто-то еще видел эту проблему?

Тем временем я изучил / прочитал еще немного и обнаружил свойство Timeline.DesiredFrameRate .

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

Однако мне пришлось применить его к одной конкретной анимации, которую я создал (в коде), используя BeginAnimation (). Я не уверен, как это повлияет на «глобальную» частоту кадров.

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

Еще одной областью, на которую можно обратить внимание, может быть RenderCapability.Tier , но у меня еще не было времени взглянуть на нее подробно.

[Update]

Нет решения, но полезный совет. Чтобы установить DesiredFramerate глобально (т. Е. Для всех анимаций в области просмотра), вы можете переопределить PropertyMetadata для Свойство зависимости Timeline.DesiredFrameRateProperty:

// Set the global desired framerate to 50 frames per second
Startup += delegate(object sender, StartupEventArgs e)
{
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
     new PropertyMetadata(50));
};

Лучше всего поместить это в конструктор стандартного класса WPF Application.

К сожалению, это не решило мою проблему, потому что даже при установке его в FPS он не должен быть достаточно точно синхронизирован с v-sync монитора.

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

[Update]

Установка DesireFrameRate на очень высокое значение, такое как 100+, похоже, уменьшает, но не устраняет мерцание. Однако один большой недостаток заключается в том, что процессор (на моем 4-летнем ПК) достигает 35%.

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