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 回答