2011-06-23 55 views
1

我正在使用WPF開發Conway的生命遊戲模擬器。程序佔用太多內存

由於某些原因,有時程序會佔用高達40萬K的內存(當我繪製很多單元格的速度非常快時)。

如何減少內存使用量和/或減少由此造成的滯後。

編輯1: 主窗口代碼: http://pastebin.com/mz0z7tBu

電網類: http://pastebin.com/ZHX1WBuK

細胞結構:

struct Cell 
{ 
    public int Neighbors {get; set;} 
    public bool Alive { get; set; } 
} 

編輯2: 我會盡力解釋程序結構: 單元格是包含類型爲int的AutoProperty鄰居和類型爲bool的AutoProperty IsAlive的結構。

CellGrid是一個包裝單元格的二維數組的類。 每次迭代,每個Cell's Neighbors屬性都會更新爲包含活動的Neighbors數量,然後將每個Cell的IsALive設置爲true或false,取決於鄰居數量和以前的IsAlive狀態。

MainWindow類有一個CellGrid類型的對象。 它將網格渲染到屏幕上。

編輯3:

XAML:http://pastebin.com/Zp3dr8zc

resources.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="{x:Type MenuItem}"> 
     <Setter Property="HorizontalContentAlignment" Value="Center" /> 
     <Setter Property="VerticalContentAlignment" Value="Center" /> 
     <Setter Property="MaxHeight" Value="32" /> 
    </Style> 
    <Style TargetType="{x:Type MenuItem}" x:Key="ParentMenuItem"> 
     <Setter Property="Width" Value="46" /> 
    </Style> 
</ResourceDictionary> 
+4

任何人都很難在沒有看到代碼的情況下提供指導。 – bronsoja

+0

你如何控制世代之間的時間? – DXM

+0

繪圖代碼或單元代碼? @DMX沒有時間。通過點擊一個按鈕傳遞世代。 –

回答

4

這是使用的DrawingContext/DrawingVisual的結果。它實際上是良性的,並且應該在系統需要時進行垃圾收集,但內存使用情況可能會令人擔憂。如果你想在畫布上繪製形狀,那麼你可能不會看到這個問題。我過去遇到過與自定義繪製控件相同的問題。切換到更多基於矢量的繪圖技術(即畫布上的形狀)可以解決內存消耗問題。

+0

謝謝:)。你有畫布使用的學習資源嗎? –

+1

他們可能是一種複雜的學習,但我的項目,WPFSVL,有這樣一個例子(http://wpfsvl.codeplex.com)。頻譜分析儀控制用來做快速渲染用的DrawingContext和DrawinVisual,但我改變了它使用的形狀來代替。當我這樣做時,我看到了一個和你的情況類似的情況。它曾經「佔用」MB內存的空間,但現在整個應用程序佔用了30 MB。 – JacobJ

+0

爲了比較,你可以找到一些老的源代碼仍然使用的DrawingVisuals這裏:http://inchoatethoughts.com/a-wpf-spectrum-analyzer-for-audio-visualization – JacobJ