Прерывистая анимация WPF

WPF для Windows-XP с пакетом обновления 3 (SP3)

У меня проблема с простой анимацией WPF.

Я использую следующий код Xaml (в XamlPad, а также в проекте WPF):

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Border Name="MyBorder" BorderThickness="10" BorderBrush="Blue" CornerRadius="10" Background="DarkRed" >
       <Rectangle Name="MyRectangle" Margin="10" StrokeDashArray="2.0,1.0" StrokeThickness="10" RadiusX="10" RadiusY="10" Stroke="Black" StrokeDashOffset="0">
           <Rectangle.Triggers>
               <EventTrigger RoutedEvent="Rectangle.Loaded">
                   <BeginStoryboard>
                       <Storyboard>
                           <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="StrokeDashOffset" From="0.0" To="3.0" Duration="0:0:1" RepeatBehavior="Forever" Timeline.DesiredFrameRate="30" />
                       </Storyboard>
                   </BeginStoryboard>
               </EventTrigger>
           </Rectangle.Triggers>
       </Rectangle>
    </Border>
</Page>

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

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

Я получаю те же симптомы в приложении WPF или в XamlPad. В случае с приложением, похоже, не имеет значения, запускаю ли я его в отладчике или запускаю исполняемый файл напрямую.

Я применил патч по этой ссылке: http://support.microsoft.com/kb/981741 и я думал, что он позаботился о проблеме, но, похоже, нет.

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

Может ли кто-нибудь дать мне несколько советов о том, как определить, в чем проблема? Существуют ли какие-либо средства диагностики WPF, которые могут помочь?

ОБНОВЛЕНИЕ: я проверил свои видеодрайверы, и они являются последней версией. (nVidia GeForce 8400 GS)


person Chris Dunaway    schedule 03.06.2010    source источник
comment
Нужна ли система-перезагрузка (т.е. перезапуск проги не помогает)? Это может выглядеть как проблема с драйвером (DirectX).   -  person Henk Holterman    schedule 04.06.2010
comment
@Chris Dunaway: +1 за вопрос после долгих усилий.   -  person Amsakanna    schedule 04.06.2010
comment
К вашему сведению: я скопировал его в новый проект и дал ему поработать несколько часов. Без проблем. Перспектива/32   -  person Henk Holterman    schedule 05.06.2010
comment
Я не могу найти ссылку, где я это читал, но в основном там говорилось: анимация WPF может отстой в Windows XP. Что-то о том, как обрабатывается (или не обрабатывается) аппаратное ускорение?   -  person Stewbob    schedule 08.06.2010
comment
Я запускал его на Windows7 x64 и Windows XP SP3 в течение часа... пока никаких проблем. На всякий случай я запускаю perfmon в системе XP, чтобы посмотреть, как выглядит использование ресурсов, если оно замедлится.   -  person Dave    schedule 08.06.2010
comment
Только запускаю анимацию, но вы оставили ее на переднем плане или переместили на задний план? Просто интересно, что я должен сделать, чтобы попытаться воспроизвести проблему.   -  person Nate Zaugg    schedule 09.06.2010
comment
@Nate - у меня нет определенных шагов, чтобы воссоздать проблему. Просто кажется, что это происходит через какое-то время. Конечно, за это время я, вероятно, запускал и останавливал многие приложения, когда использовал машину.   -  person Chris Dunaway    schedule 10.06.2010


Ответы (4)


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

В итоге я запустил ваш пример на XP SP3 в kaxaml, а затем провел небольшую проверку производительности с помощью perfmon.

Если вы раньше не использовали perfmon, просто выполните Run -> perfmon из меню «Пуск». Скорее всего, в списке уже будет несколько счетчиков, но вы можете щелкнуть каждый и удалить их, если не хотите отслеживать эти значения. Я не думаю, что загрузка процессора в вашем случае является проблемой, но вы можете оставить ее на всякий случай.

Щелкните правой кнопкой мыши в любом месте и выберите «Добавить счетчики», затем в разделе «Объект производительности» выберите «Память .NET CLR». Справа выберите интересующий исполняемый файл (в моем случае это «Kaxaml»). С левой стороны выберите «# байт во всех кучах». Я бы также изменил частоту дискретизации на что-то большее, например, 300 секунд, чтобы вы могли лучше понять скорость изменения за период времени, в течение которого вы испытываете замедление.

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

person Dave    schedule 10.06.2010
comment
Спасибо, Дэйв. У меня не складывается впечатление, что проблема только во времени. Я думаю, что это должно быть сочетание факторов. Я принимаю этот ответ из-за советов по проверке производительности. - person Chris Dunaway; 10.06.2010

Я позволил анимации работать более 30 часов, и она не замедлилась и не стала прерывистой, но я использую Win 7. Я также позволил ей работать на виртуальной машине XP в течение нескольких часов, и она работает нормально.

Мое лучшее предположение: видеодрайвер

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

Предложения:

  • Проверить наличие обновления драйвера
  • Попробуйте другую видеокарту (если возможно)
  • Взломайте PerfMon и получите все возможные счетчики WPF и DirectX и отслеживайте их с течением времени.
person Nate Zaugg    schedule 10.06.2010

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

person Steven    schedule 10.06.2010

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

По наитию я закрыл Google Chrome, который я открыл, и заикание полностью исчезло. Если у вас открыты какие-либо веб-браузеры во время его работы, попробуйте закрыть их и посмотреть, поможет ли это, у меня это сработало.

person MattE    schedule 23.08.2016