ang*_*son 5 c# wpf children canvas slowdown
我正在尝试使用WPF并重新实现我的旧迷宫屏幕保护程序.
我的代码基本上将一堆图像添加到画布,并排构建一个网格,64x64像素图像,以覆盖整个画布.然后我通过调整平移变换并交换图像,在迷宫中"动画"运动,该运动应该围绕迷宫滚动.
但是,我似乎有某种泄漏.每当我调整窗口大小时,我都想重新构建图像组件,以便再次覆盖表单,或者使用更多或更少的图像.
如果我将形式的左下角拖动到紧密的圆圈中,则重建部分会变得越来越慢.
要删除旧控件我只是这样做:
_Canvas.Children.Clear();
Run Code Online (Sandbox Code Playgroud)
这够了吗?由于减速,我认为不是.
然而,由于迷宫目前没有被"头像""发现",迷宫图像以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;
}
}
Run Code Online (Sandbox Code Playgroud)
之后他们会分配图像来显示如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
我还应该寻找什么?是否需要以任何方式处理图像组件?
调用_Canvas.Children.Clear();
将从可视树中删除对图像的所有引用,因此没有泄漏.您可能想要检查保留的旧图像引用_Images
,或者您可能正在维护的其他一些集合.例如,您说您正在缓存图像源 - 这样做效率低下,或者维护不断增长的陈旧图像列表肯定会影响您的系统.
归档时间: |
|
查看次数: |
9549 次 |
最近记录: |