Плавная анимация текста (Marquee) с использованием WPF
Вопрос
Пытаюсь создать элемент управления marquee с плавной текстовой анимацией.Текущие усилия включают в себя:
- Использование translate преобразования
- Использование анимации в свойствах зависимости Canvas (слева, справа)
- Использование анимации для пользовательского свойства зависимости (Point) и использование графических элементов рисования (formattedtext)
- Использование CompositionTarget.Визуализация
Но анимация по-прежнему прерывистая и ресурсоемкая (2-10% процессора).
Тестовый код, используемый в окне wpf по умолчанию, которое, я полагаю, должно создавать плавную анимацию:
<TextBlock x:Name="_box" FontSize="64" CacheMode="BitmapCache" Text="lorem ipsum">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="AnimatedTranslateTransform" X="0" Y="0" />
</TextBlock.RenderTransform>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="TextBlock.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="AnimatedTranslateTransform"
Storyboard.TargetProperty="X"
From="-300" To="300" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
Контрольный список:
- Подтверждено, что программный рендеринг не выполняется (ms performance tool и проверка возможности рендеринга.Уровень)
- Вызов freeze для любого мыслимого объекта
- Отключен любой растровый эффект и прозрачность
- Проверил все элементы управления marquee (те же проблемы)
Проверено на:
- Процессор:Intel core 2 duo (T6600) с частотой 2,2 ГГц
- ОЗУ:4 ГБ
- Графический процессор:NVidia GeForce 9600M GS (последние версии драйверов)
- Операционная система:Windows 7 (64-разрядная версия)
Есть какие-нибудь идеи (или, еще лучше, пример кода)?
Из ответов кажется, что это не проблема wpf (другие элементы управления marquee отлично работают для других, но не для меня), но я получаю одни и те же проблемы на каждой машине, на которой я тестировал это.
Решение
Надеюсь, это может помочь вам - http://jobijoy.blogspot.com/2008/08/silverlight-marquee-control.html.
И версия WPF также можно найти здесь
Другие советы
Ваша анимация будет полностью обработана на уровне MilCore, если:
- Ваша TranslateTransform - это RenderTransform (не LayoutTransform), и
- Вы используете простую анимацию, такую как DoubleAnimation, и
- Ваш объект не имеет никаких вычислений обрезки или непрозрачности
Попробуйте использовать анимированную с помощью DoubleAnimation TranslateTransform для RenderTransform для текстового блока, который является прямым дочерним элементом окна с настройками по умолчанию.
Если это все еще происходит медленно, значит, в вашей системе Direct3D что-то происходит медленно, потому что управляемый код вообще не задействован, а вызовы MilCore очень просты, но
Если он работает плавно и эффективно, постепенно меняйте его на свой низкоэффективный код, чтобы увидеть, какие изменения вызывают замедление.
Учитывая ваш ответ на ответ Джоби Джой, я бы заподозрил, что проблема где-то в вашем оборудовании или настройках Direct3D, но единственный способ выяснить это - протестировать его.
Если вы используете WPF 4.0, попробуйте установить CacheMode="BitmapCache"
(в XAML) на элементе вы анимируете, в этом случае, вероятно, TextBlock
.