1

私は WPF を使用して、Conway の Game of Life のシミュレーターを開発しています。

何らかの理由で、プログラムが最大 400,000K のメモリを使用することがあります (多数のセルを非常に高速に描画する場合)。

メモリ使用量を減らしたり、それによって引き起こされるラグを減らしたりするにはどうすればよいですか。

編集 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 は、セルの 2D 配列をラップするクラスです。反復ごとに、各セルの Neighbors プロパティが更新されて、生きているネイバーの数が含まれます。次に、各セルの IsALive が true または false に設定されます。これは、ネイバーの数と以前の IsAlive 状態に依存します。

MainWindow クラスには、CellGrid タイプのオブジェクトがあります。グリッドを画面にレンダリングします。

編集3:

XAML: http://pastebin.com/Zp3dr8zc

リソース.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

1 に答える 1

4

これは DrawingContext/DrawingVisual を使用した結果です。これは実際には良性であり、システムが必要とするときにすべてガベージ コレクションを行う必要がありますが、メモリの使用量が驚くほど多くなる可能性があります。代わりに、キャンバスに図形を描く場合は、おそらくこの問題は発生しません。過去にカスタム描画コントロールで同じ問題に遭遇しました。ベクトルベースの描画手法 (つまり、キャンバス上の形状) に切り替えると、メモリ消費の問題が修正されました。

于 2011-06-23T05:05:12.717 に答える