6

私は WPF を試し、古い迷路のスクリーンセーバーを再実装しています。

私のコードは基本的にキャンバスに大量の画像を追加し、64x64 ピクセルの画像を並べてグリッドを作成して、キャンバス全体をカバーします。次に、移動変換を調整し、画像を交換することで、迷路をスクロールすることになっている迷路内の動きを「アニメート」します。

しかし、私はある種のリークを持っているようです。ウィンドウのサイズを変更するたびに、画像コンポーネントを再構築して、フォームを再びカバーするために、画像の数を増やしたり減らしたりしたいと考えています。

フォームの左下隅をきつい円でドラッグすると、再構築部分がどんどん遅くなります。

古いコントロールを削除するには、次のようにしました。

_Canvas.Children.Clear();

これで十分ですか?減速のため、そうではないと思います。

ただし、迷路は現在「アバター」によって「発見」されていないため、迷路の画像は 25% の不透明度で描画されています。しかし、そうでもないようです。

画像ソースをキャッシュしています。画像コンポーネントは次のように作成されます。

_Images = new Image[(int)width, (int)height];
for (int x = -1; x < width - 1; x++)
{
    for (int y = -1; y < height - 1; y++)
    {
        Image i = new Image();
        i.Width = 64;
        i.Height = 64;
        i.Source = _Outside;
        Canvas.SetLeft(i, x * 64);
        Canvas.SetTop(i, y * 64);
        _Canvas.Children.Add(i);
        _Images[x + 1, y + 1] = i;
    }
}

その後、次のように表示する画像が割り当てられます。

Maze.Square sq = _Maze[_TopLeftMazeX + x, _TopLeftMazeY + y];
Image img = _Images[x + 1, y + 1];

if (sq.Seen)
    img.Opacity = 1.0;
else
    img.Opacity = 0.25;
switch (sq.Type)
{
    case Maze.SquareType.Hallway:
        img.Source = _Hallway;
        break;

    case Maze.SquareType.Wall:
        img.Source = _Wall;
        break;

    case Maze.SquareType.Outside:
        img.Source = _Outside;
        break;
}

他に何を探すべきですか?何らかの方法で画像コンポーネントを破棄する必要はありますか?

4

1 に答える 1

6

を呼び出す_Canvas.Children.Clear();と、画像へのすべての参照がビジュアル ツリーから削除されるため、リークはありません。に保持されている古いイメージ参照_Imagesや、維持している他のコレクションを確認することができます。たとえば、画像ソースをキャッシュしていると言いましたが、これを非効率に行ったり、増え続ける古い画像のリストを維持したりすると、システムに確実に影響を与えます。

于 2010-02-18T20:39:18.657 に答える