gpt4 book ai didi

c# - 避免 Windows Phone 8 中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:19 26 4
gpt4 key购买 nike

我这里有问题:(
我正在尝试通过 XAML 编写一个小游戏,一种重复回合游戏。我使用 Storyboard通过在图像 (processbar.png) 和 Stackpanel (spImageList) 上移动指针来显示经过的转弯时间(通常为 3-6 秒),在其中我在每个转弯处操作并删除了一些 BitmapImage。代码如下所示:

<Grid Grid.Column="1">
<Canvas Canvas.ZIndex="1" >
<Canvas.Resources>
<Storyboard x:Name="myStoryboard" Completed="myStoryboard_Completed">
<!-- Animate the center point of the ellipse. -->
<DoubleAnimation Storyboard.TargetName="Pointer"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Duration="0:0:7"
From="15" To="310"/>
</Storyboard>
</Canvas.Resources>
<Image Source="/Assets/Image/pointer.png" x:Name="Pointer">
<Image.RenderTransform>
<CompositeTransform TranslateX="15"/>
</Image.RenderTransform>
</Image>
</Canvas>
<Image Source="/Assets/Image/processbar.png" Width="350"/>
</Grid>

<Grid Grid.Row="2" HorizontalAlignment="Center" Margin="0,10,0,0">
<StackPanel x:Name="spImageList" Orientation="Horizontal" HorizontalAlignment="Center" Canvas.ZIndex="1" />
<Image Source="/Assets/Image/background.png" Width="550"/>
</Grid>

C#代码

private void myStoryboard_Completed(object sender, EventArgs e)
{
spImageList.Children.Clear(); // remove all image from last turn
myStoryboard.Begin();

// Manipulated Images for new turn;
...
//

foreach (var img in ImageList)
spImageList.Children.Add(img);
}

游戏结束后,人们离开页面时我使用了这段代码:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
myStoryboard.Stop();
spImageList.Children.Clear();
base.OnNavigatedFrom(e);
Debug.WriteLine("mem navigate from Playpage: " + GC.GetTotalMemory(true).ToString());
}

但在我玩了 2 或 3 个游戏后,应用程序运行缓慢且滞后,最后我的应用程序崩溃了。我使用 Debug.writeline 并看到即使在 MainPage(从 PlayPage 导航后)内存应用程序也没有减少我清除了导航缓存并使用 GC 收集。

if (this.NavigationService.CanGoBack)
{
while (this.NavigationService.BackStack.Any())
{
this.NavigationService.RemoveBackEntry();
}
}
GC.Collect();

所以我只是想知道这里是否有避免内存泄漏的正确方法(我认为这是因为 Storyboard和我在游戏中操纵的图像)

最佳答案

存在与图像类相关的泄漏。

确保在丢失对图像的引用之前执行此操作:

BitmapImage bitmapImage = image.Source as BitmapImage;
bitmapImage.UriSource = null;
image.Source = null;

找到更多解释here , 和 here ,还有:Why do I get an OutOfMemoryException when I have images in my ListBox?

关于c# - 避免 Windows Phone 8 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25702524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com