在C#中使用多个控件时绘制速度慢

时间:2013-11-05 02:28:33

标签: c# performance drawing

我一直在尝试创建一年多一年的滚动游戏,我认为测试它并将其充实的一种好方法是把它变成龙与地下城的变种。然而,使用DnD设置的固有问题是需要跟踪很多,以至于单个人不可能自己完成。因此,我想写一个C#程序来帮助。

当我尝试使用一系列PictureBox对象来表示字符可以移动的地图上的空格时,我遇到了这个问题。我想使用PictureBoxes,因为这样我就可以使用图像来表示占据给定空间的地形和角色。但是,我使用的地图大约是46 x 75 1英寸的正方形,总共3450个PictureBoxes。这可以理解地减慢了应用程序的速度,以至于它每隔一段时间重新绘制地图时实际上会冻结几分钟。

我尝试了两种解决方案。首先,我尝试使用Panel对象来实现其自由滚动功能,希望应用程序不必重绘整个地图,而只需要重绘当时可见的PictureBox的子集。这只是一点点帮助,并不足以使应用程序可用。其次,我在线查看,包括这个论坛,发现人们有类似的问题。但是,他们遇到的问题与我的问题完全无关(除了整个缓慢重绘的事情),因此解决方案并不适用于我。我确实看到了一些我试过的反复出现的行:

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);

我不确定他们做了什么,但他们确实有所帮助。不过,我仍然看到太多的滞后。

我现在没有想法。有没有更好的控制我可以使用或不同的绘图方式?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我会尝试开发一种解决方案,只在任何给定时间呈现屏幕上可见的图像。只有在将图像滚动到焦点时才能渲染图像。 这是一种常见的技术,因为渲染UI通常是迄今为止最慢的操作。我会将视图模型对象绑定到可见对象,这意味着您只需渲染图像的子集而不是整个屏幕。

带有无限滚动的网格有时会使用这种方法。