Windows Phone 8中的Advoid内存泄漏

本文关键字:内存 泄漏 Advoid 中的 Phone Windows | 更新日期: 2023-09-27 18:21:06

我在这里遇到问题:(
我正在尝试用XAML编写一个小游戏,一种重复回合游戏。我使用Storyboard通过在图像(processbar.png)和堆栈面板(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());
    }  

但在我玩了两三场游戏后,应用程序出现了缓慢和滞后,最终导致我的应用程序崩溃。我使用了Debug.writeline,发现即使在MainPage(从PlayPage导航后),内存应用程序也没有减少,我清除了导航缓存并使用GC收集。

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

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

Windows Phone 8中的Advoid内存泄漏

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

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

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

这里,这里,那里还有更多的解释:当我的ListBox中有图像时,为什么我会得到OutOfMemoryException?