Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中创建简单加载动画时的性能问题_C#_Wpf_Performance_Animation - Fatal编程技术网

C# 在WPF中创建简单加载动画时的性能问题

C# 在WPF中创建简单加载动画时的性能问题,c#,wpf,performance,animation,C#,Wpf,Performance,Animation,我试图在WPF中创建一个闪亮的加载微调器。它应该是一圈一圈地旋转,让用户在我处理数据时可以看到一些东西。附上照片。您可能会注意到,实际结果的质量有点低。这是因为无论我尝试做什么,微调器都需要大约5%到7%的CPU。这对我来说是不可接受的,因为。。。嗯,这是一个旋转器。当电脑忙着做某件事时,它就会旋转,坦白地说,我希望它早一点做那件事,而不是晚一点 (来源:) 好的,XAML代码定义了两个嵌套网格,如下所示: <Grid xmlns="http://schemas.mi

我试图在WPF中创建一个闪亮的加载微调器。它应该是一圈一圈地旋转,让用户在我处理数据时可以看到一些东西。附上照片。您可能会注意到,实际结果的质量有点低。这是因为无论我尝试做什么,微调器都需要大约5%到7%的CPU。这对我来说是不可接受的,因为。。。嗯,这是一个旋转器。当电脑忙着做某件事时,它就会旋转,坦白地说,我希望它早一点做那件事,而不是晚一点


(来源:)

好的,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" />