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();
,所以我只是想知道是否有避免此內存泄漏正確的方式(我認爲這是因爲故事板和圖像我在遊戲中操縱)
所以行:spImageList.Children.Clear ();沒有清除圖像?這很奇怪:)以及故事板如何,它是否暴露自己或我必須做些什麼呢? – user3448806 2014-09-06 18:04:03
「這很奇怪」是的,它是:)認爲圖像是'IDisposable',沒有辦法調用'Dispose' - 你需要使用上面的代碼片段來「處理」一個圖像。這是該框架中已知的缺陷/錯誤。圖像可能導致內存泄漏,但我不能保證這是唯一的泄漏。 – Peter 2014-09-06 23:01:43