1

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

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

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

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

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

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

4

1 回答 1

2

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

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

于 2013-11-05T02:38:08.633 回答