私は 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;
}
他に何を探すべきですか?何らかの方法で画像コンポーネントを破棄する必要はありますか?