我在这里有一个问题:(
我正在尝试用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#code
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);
}
当游戏结束时,当人们离开Page:
时,我使用了这段代码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();
所以我只是想知道这里是否有正确的方法来避免内存泄漏(我认为这是因为故事板和我在游戏中操作的图像)
答案 0 :(得分:0)
与图像类有关的泄漏。
确保在丢失对图像的引用之前执行此操作:
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?