C# 在WPF中创建简单加载动画时的性能问题
我试图在WPF中创建一个闪亮的加载微调器。它应该是一圈一圈地旋转,让用户在我处理数据时可以看到一些东西。附上照片。您可能会注意到,实际结果的质量有点低。这是因为无论我尝试做什么,微调器都需要大约5%到7%的CPU。这对我来说是不可接受的,因为。。。嗯,这是一个旋转器。当电脑忙着做某件事时,它就会旋转,坦白地说,我希望它早一点做那件事,而不是晚一点C# 在WPF中创建简单加载动画时的性能问题,c#,wpf,performance,animation,C#,Wpf,Performance,Animation,我试图在WPF中创建一个闪亮的加载微调器。它应该是一圈一圈地旋转,让用户在我处理数据时可以看到一些东西。附上照片。您可能会注意到,实际结果的质量有点低。这是因为无论我尝试做什么,微调器都需要大约5%到7%的CPU。这对我来说是不可接受的,因为。。。嗯,这是一个旋转器。当电脑忙着做某件事时,它就会旋转,坦白地说,我希望它早一点做那件事,而不是晚一点 (来源:) 好的,XAML代码定义了两个嵌套网格,如下所示: <Grid xmlns="http://schemas.mi
(来源:) 好的,XAML代码定义了两个嵌套网格,如下所示:
<Grid
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WPFTest.Spinner"
Name="View" Width="40" Height="40">
<Grid Name="Grid" Width="40" Height="40" >
<Grid.CacheMode>
<BitmapCache EnableClearType="False" RenderAtScale="1" SnapsToDevicePixels="False"/>
</Grid.CacheMode>
</Grid>
</Grid>
微调器构造函数
public Spinner()
{
InitializeComponent();
const double step = 2 * Math.PI / Count; //Cound is const = 8
const double r = 1.4 * Field; //Field is const = 40
double angle = 0;
for (var i = 0; i < Count; i++)
{
Grid.Children.Add(GetEllipse(r * Math.Cos(angle), r * Math.Sin(angle), 1 - i/(double) Count));
angle += step;
}
_doubleAnimation = new DoubleAnimation(0, 360, new Duration(new TimeSpan(0, 0, 1)))
{
RepeatBehavior = RepeatBehavior.Forever,
};
Grid.RenderTransform = new RotateTransform(0, Field, Field);
RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor); //Low quality!
Grid.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, _doubleAnimation );
}
public微调器()
{
初始化组件();
const double step=2*Math.PI/Count;//connd是const=8
常数双r=1.4*字段;//字段为常数=40
双角度=0;
对于(变量i=0;i
现在,所有这些基本上都起作用了,当你删除那些将所有内容设置为低质量的行时,它甚至有点漂亮。但它最终是无用的。如果我正在加载一些东西,而这个旋转器占用了我5-7%的CPU,那么这对我来说就是个问题。当然,多核。。。无论什么不,这应该有用!:)
我解决这个问题的下一个最好的办法不是旋转微调器,而是在间隔一段时间后重置每个椭圆的颜色。我最终会尝试,但与此同时,了解发生了什么,以及为什么如此简单的动画要花很长时间,这将是非常有趣的。此外,如果有一个“MakeAnimationWorkBetter”属性我还没有设置,我将非常有义务找出在哪里以及如何设置
提前感谢。您可以通过TimeLine降低动画的帧速率。DesiredFrameRate attached属性:
<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:0.5"
From="1.0" To="0.5" Timeline.DesiredFrameRate="30" />
默认值为60fps
问候,,
Colin E.与其使用相对昂贵的旋转变换,为什么不改变椭圆的不透明度,这是一种更便宜的操作
吉拉德。非常感谢你,科林,这个方法非常有效。另一方面,为单个椭圆的不透明度设置动画所消耗的CPU同样多。
<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:0.5"
From="1.0" To="0.5" Timeline.DesiredFrameRate="30" />