【问题标题】:How to make animation work good on all machines in WPF application? [closed]如何使动画在 WPF 应用程序中的所有机器上都能正常工作? [关闭]
【发布时间】:2020-02-16 12:55:38
【问题描述】:

我有 C# + WPF 应用程序。 我创建了将元素从一个点移动到另一个点的动画。 我有一个调用方法的热键>方法启动动画 我的 PC 上的动画效果很好(我有非常强大的 PC),但是如果另一个拥有不错 PC 的用户使用我的应用程序动画会有一些滞后或冻结。看起来它的采样率很低

所以,问题是动画在其他 PC 上效果不佳

我注意到,如果我运行我的应用程序和任务管理器,我发现 GPU 负载正在消耗,当我运行带有动画开始的方法时,GPU 负载正在增加,并且每次单击带有动画的热键时,GPU 负载可能高达 15%方法。

当前结果:动画效果不佳,有些滞后

预期结果:动画效果良好且流畅

如何让动画在所有机器上都能正常工作?

My PC:

Others PC

 public class HotKeys
{

DoubleAnimation animShowCard = new DoubleAnimation(100, TimeSpan.FromMilliseconds(250));
DoubleAnimation animShowCardOffset = new DoubleAnimation(0, TimeSpan.FromMilliseconds(150));


 public HotKeys(MainWindow _window)
    {
        SineEase sineEase = new SineEase();
        sineEase.EasingMode = EasingMode.EaseOut;
        animShowCard.EasingFunction = sineEase;
        animShowCardOffset.EasingFunction = sineEase;

         animShowCard.Completed += (s, e) =>
        {
          window.cardQuestionBorder.RenderTransform = new TranslateTransform(100, 0);
          window.cardQuestionBorder.RenderTransform.BeginAnimation(TranslateTransform.XProperty, animShowCardOffset);            

        };
    }

     //call a method with animation when D1 hotkey is clicked
         if (e.Key == Key.D1)
         {
            e.Handled = true;  
              ShowCard();
          }

     //method that show animation
      private void ShowCard()
    {
        window.cardQuestionBorder.RenderTransform = new TranslateTransform(-1600, 0);
        window.cardQuestionBorder.RenderTransform.BeginAnimation(TranslateTransform.XProperty, animShowCard);
    }
}

我尝试将动画的 SampleRate(我认为 60 帧是默认值)更改为 25 或更少,但即使在我的 PC 上它也会变得更糟:

Timeline.SetDesiredFrameRate(animShowCard, 25);

编辑:

我记录了我在其他 PC 上运行的应用程序,它消耗了高达 45% 的 GPU 负载

Users PC Video

编辑 2:

我找到了根本问题。这是一张卡片的阴影效果。我在xaml中使用它。当我移除这个东西时,动画一直运行流畅且非常好

<Border.Effect>
                    <DropShadowEffect Color="Black"
                                      Direction="320"
                                      BlurRadius="60"
                                      ShadowDepth="40"
                                      Opacity="0.8" />
                </Border.Effect>

有什么办法可以解决吗?我可以使用其他阴影类型吗?如何在后面的代码中使用它?

【问题讨论】:

  • 请用适当的缩进格式化您的代码
  • 您能否在发布时使用 alt+F2 对您的 UI 进行基准测试并在其他机器上共享结果?您的 UI 线程上可能发生了其他事情,从而减慢了动画的速度。另外:硬件是什么(你的电脑和其他人)?
  • @Soleil 我无法在其他机器上对我的应用程序进行基准测试,因为我应该安装 IDE 和我的应用程序中使用的所有库。我的 PC 是 Nvidia 1050 TI、Ryzen 7 和 32 GB 内存。用户的 PC 是一台不错的 PC,可以处理常见的桌面应用程序,如 Adob​​e Premiere 或 Skype 或 Photoshop。用户的电脑速度不算太慢。
  • 我认为问题出在动画本身。可能是我以错误的方式创建它吗?
  • @kenny 很有趣。该问题似乎与过度使用 GPU 有关。我猜原因是表单上的阴影效果(效果通常是资源消耗)。 To get a better idea of what's exactly happening, you should try profiling render times in your application.

标签: c# wpf


【解决方案1】:

问题是我在边框上使用了阴影效果。边框包含许多元素,如矩形和文本。效果适用于边框中的所有元素。这就是它反映 GPU 使用情况的原因。我只是在内部元素上而不是在边框上应用了阴影效果,现在动画效果很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多