2014-09-06 147 views
2

我在这里有一个问题:(
我想用XAML编写一个小游戏,一种重复转向游戏 我使用了一个Storyboard来显示流逝的时间通过在图像上移动一个指针(processbar.png)和一个Stackpanel(spImageList)来转动(通常从3-6秒),其中我每次操作并移除一些BitmapImage。代码如下所示:Windows Phone 8中的Advoid内存泄漏

<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); 
    } 

瓦EN比赛结束后,我用这个代码的人离开时页:

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场比赛后,应用就慢慢laggy,终于崩溃我的应用程序。 我用Debug.writeline,看到内存应用程序甚至在MainPage(从PlayPage导航后)并没有减少我清除导航缓存并使用GC收集。

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

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

回答

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?

+0

所以行:spImageList.Children.Clear ();没有清除图像?这很奇怪:)以及故事板如何,它是否暴露自己或我必须做些什么呢? – user3448806 2014-09-06 18:04:03

+1

“这很奇怪”是的,它是:)认为图像是'IDisposable',没有办法调用'Dispose' - 你需要使用上面的代码片段来“处理”一个图像。这是该框架中已知的缺陷/错误。图像可能导致内存泄漏,但我不能保证这是唯一的泄漏。 – Peter 2014-09-06 23:01:43