【发布时间】:2021-05-09 16:18:26
【问题描述】:
我为 UWP 编写了一个音乐播放器,它在播放音乐时使用一些动画,比如旋转封面。
我注意到桌面窗口管理器 (dwm.exe) 每秒消耗大约 1 MB 内存。上面显示的动画每秒消耗大约 300-400kb。关闭 App 不会释放内存。
暂停动画将停止韭菜。恢复它,它又开始泄漏了。
Animated 元素是这样定义的(完整文件在github):
<Ellipse
x:Name="CoverDisc"
Margin="{Binding ElementName=root, Path=ProgressThikness, Converter={StaticResource thiknessConver}, ConverterParameter={StaticResource thiknessParameter}}"
RenderTransformOrigin="0.5,0.5"
Stroke="{Binding ElementName=root, Path=BorderBrush}"
StrokeThickness="{Binding ElementName=root, Path=ProgressThikness}">
<Ellipse.Resources>
<Storyboard x:Key="Storyboard">
<DoubleAnimation
RepeatBehavior="Forever"
Storyboard.TargetName="transform"
Storyboard.TargetProperty="Angle"
To="360"
Duration="0:0:20" />
<!-- Duration="0:0:1.8" this is record spped -->
</Storyboard>
</Ellipse.Resources>
<Ellipse.RenderTransform>
<RotateTransform x:Name="transform" />
</Ellipse.RenderTransform>
<Ellipse.Fill>
<ImageBrush ImageSource="{Binding Cover, ElementName=root, TargetNullValue={StaticResource FallbackCover}}" Stretch="UniformToFill" />
</Ellipse.Fill>
</Ellipse>
动画是通过代码控制的:
private static void IsPlayingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var me = d as NowPlayingDisk;
var elipse = me.CoverDisc;
if (elipse is null)
return;
var storyboard = elipse.Resources["Storyboard"] as Windows.UI.Xaml.Media.Animation.Storyboard;
if ((bool)e.NewValue)
{
if (storyboard.GetCurrentState() == Windows.UI.Xaml.Media.Animation.ClockState.Stopped)
storyboard.Begin();
else
storyboard.Resume();
}
else
storyboard.Pause();
}
除了不使用任何动画来减少内存占用之外,我还能做什么?我注意到过去 dwm 消耗超过 7Gb,几乎不可能使用机器。
我现在使用这个应用程序有一段时间了,我不确定这个问题是否一直存在。它在过去确实运行了几个小时,至少我没有注意到任何消耗这么多内存的东西。
我在装有当前 Windows 版本的 Surface Pro 6 上运行:
Edition Windows 10 Home
Version 20H2
Installiert am 16.10.2020
Betriebssystembuild 19042.964
Leistung Windows Feature Experience Pack 120.2212.2020.0
Prozessor Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz 2.11 GHz
Installierter RAM 16,0 GB
Systemtyp 64-Bit-Betriebssystem, x64-basierter Prozessor
编辑
我能够在另一台运行旧版本 Windows 的机器上对其进行测试。 在那台机器上,内存消耗完全没有问题。
Windows 10 Enterprise
Version 1908
Betriebssystembuild 17763.1879
【问题讨论】:
-
您使用的英特尔显卡驱动程序是否会泄漏内存? intel.com/content/www/us/en/support/articles/000058381/graphics/…
-
@PatrikLundquist 是的,我做到了,我刚刚更新,现在我正在测试是否仍然可以重现内存泄漏
-
@PatrikLundquist 在 Wokr 看来 :) dwm 的内存在一个小时内没有增加
标签: c# uwp memory-leaks dwm