2014-09-06 151 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