【发布时间】:2020-02-16 12:55:38
【问题描述】:
我有 C# + WPF 应用程序。 我创建了将元素从一个点移动到另一个点的动画。 我有一个调用方法的热键>方法启动动画 我的 PC 上的动画效果很好(我有非常强大的 PC),但是如果另一个拥有不错 PC 的用户使用我的应用程序动画会有一些滞后或冻结。看起来它的采样率很低
所以,问题是动画在其他 PC 上效果不佳
我注意到,如果我运行我的应用程序和任务管理器,我发现 GPU 负载正在消耗,当我运行带有动画开始的方法时,GPU 负载正在增加,并且每次单击带有动画的热键时,GPU 负载可能高达 15%方法。
当前结果:动画效果不佳,有些滞后
预期结果:动画效果良好且流畅
如何让动画在所有机器上都能正常工作?
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 负载
编辑 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,可以处理常见的桌面应用程序,如 Adobe Premiere 或 Skype 或 Photoshop。用户的电脑速度不算太慢。
-
我认为问题出在动画本身。可能是我以错误的方式创建它吗?
-
@kenny 很有趣。该问题似乎与过度使用 GPU 有关。我猜原因是表单上的阴影效果(效果通常是资源消耗)。 To get a better idea of what's exactly happening, you should try profiling render times in your application.