使用 WPF 平滑文本动画(选取框)
Posted
技术标签:
【中文标题】使用 WPF 平滑文本动画(选取框)【英文标题】:Smooth text animation (Marquee) using WPF 【发布时间】:2011-03-01 10:39:50 【问题描述】:尝试构建一个带有平滑文本动画的选取框控件。目前的努力包括:
使用平移变换 在 Canvas 依赖属性(左、右)上使用动画 在自定义依赖属性 (Point) 上使用动画并使用绘图视觉效果 (formattedtext) 使用 CompositionTarget.Rendering但动画仍然不稳定且占用大量资源(2-10% CPU)。
在默认 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 性能工具并检查 RenderCapability.Tier) 对任何可以想象的对象调用冻结 禁用任何位图效果和透明度 检查了所有的选取框控件(同样的问题)测试日期:
CPU:Intell core 2 duo (T6600) @2.2Ghz 内存:4GB GPU:NVidia GeForce 9600M GS(最新驱动程序) 操作系统:Windows 7(64 位)有什么想法(或更好的代码示例)吗?
从回复来看,这似乎不是 wpf 问题(其他选取框控件对其他人来说很好,但对我来说不是),但我在每台测试过的机器上都遇到了同样的问题。
【问题讨论】:
似乎有些电脑有问题。构建发布版本也有很大帮助。 【参考方案1】:希望这可以帮助你 - http://jobijoy.blogspot.com/2008/08/silverlight-marquee-control.html
WPF版本也可以找到here
【讨论】:
是的,它是我看过的控件之一(包括 wpf 版本),它并不流畅,而且对于这样一个简单的任务来说它是相当耗费资源的。 我在一些旧硬件上尝试了 Jobi Joy 示例应用程序的 Silverlight 和 WPF 版本。两者的动画都很流畅并且使用的资源很少,尽管它们的动画远不止一个简单的选取框。我认为导致问题的硬件或环境一定有什么特别之处。也许您应该在您的问题中添加详细的硬件、操作系统、NET Framework 规范和资源使用情况编号,以便其他人可以尝试复制您的问题。 这真的很奇怪——我在文本和图像上测试过的每台机器每 2 到 5 秒抖动一次。我已经更新了我的问题。 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。【参考方案2】:如果出现以下情况,您的动画将完全在 MilCore 层处理:
-
您的 TranslateTransform 是 RenderTransform(不是 LayoutTransform),并且
您使用了一个简单的动画,例如 DoubleAnimation,并且
您的对象没有剪裁或不透明度计算
尝试在 TextBlock 上使用 DoubleAnimation 动画 TranslateTransform 进行 RenderTransform,该 TextBlock 是具有默认设置的 Window 的直接子级。
如果这仍然很慢,则说明您的 Direct3D 系统有些慢,因为根本不涉及托管代码,而且 MilCore 的调用非常简单,但是
如果它运行顺利且高效,请逐步将其更改为性能不佳的代码,以查看导致速度变慢的更改。
鉴于您对 Jobi Joy 的回答,我怀疑问题出在您的硬件或 Direct3D 设置中,但找出问题的唯一方法是对其进行测试。
【讨论】:
我已经尝试过了(请参阅更新的问题) - 我仍然遇到同样的问题。如果我正在处理的机器出现问题,您能想到任何诊断方法吗?【参考方案3】:如果您使用的是 WPF 4.0,请尝试在您正在制作动画的元素上设置 CacheMode="BitmapCache"
(在 XAML 中),在这种情况下,可能是 TextBlock
。
【讨论】:
好主意 - 但它不能解决我的问题。看来问题出在我的机器(操作系统或硬件)上,但我什么都想不出来。 天哪!我在涉及大约 50 个 UI 元素的动画上遇到了问题。这困扰了我几个星期,但被这一属性清除了。 Arg,为什么我花了这么长时间才找到这个?以上是关于使用 WPF 平滑文本动画(选取框)的主要内容,如果未能解决你的问题,请参考以下文章