我目前在Windows 窗体应用程序中工作,并且正在制作本质上将成为游戏地图编辑器的东西。我解决这个问题的方法是有一个中央TabControl
,每个都TabPage
包含一个自定义控件PictureBox
,所有其他 UI 控件都围绕这个中央TabControl
。使用PictureBox
它的 Paint 事件来绘制放置在地图上的所有内容,因此将多个大小、旋转和比例等的图像绘制到单个PictureBox
. 到目前为止,这一切进展顺利。TabPage
本质上用作 的视图窗口,PictureBox
大小为 (1280x720)。
问题在于地图的制作比例。屏幕上的平均(也是最大)地图大小约为19200x10800 像素,并且可以在任何一点由数百个项目组成。当仅绘制大小为19200x10800 像素的背景图像PictureBox
时,当它重新绘制时开始闪烁并使程序无法使用。由于地图太大,您可以在它们周围平移,这就是闪烁真正显示的地方。此外,为了文件大小,我不想使用19200x10800px图像源,并且缩放图像质量根本不是问题。
我已经阅读了大量关于为什么会这样的阅读,并且感觉到目前为止我已经尝试了一切。到目前为止,我尝试过:
- 背景图像只有 1920x1080 并将其放大 10 倍
- 从 1920x1080 图像开始,以编程方式调整其大小并绘制此图像
- 将背景分割成多个部分(我尝试了许多不同的数量)并仅绘制视图窗口可以看到的部分(尝试了小(1080p)和大(10800p)图像)
- 使用图形剪辑,以便只绘制屏幕上的东西
- 在图片框和图片框所在的窗体上都使用了双缓冲
- 将初始化时的图像转换为具有更快格式的“优化位图”,然后绘制位图
我可能已经尝试了其他一些事情以及一些小的优化,但是我花了很长时间才忘记了其余的事情。从我读过的内容来看,由于某种性能原因或图片框的限制,它最有可能与控件重绘速度过慢有关,但是由于缺乏表单应用程序控件的经验,我无法确切知道发生了什么。
目前要在Paint
事件中绘制背景我有:
g.DrawImage(image, new Rectangle(0, 0, (int)(image.Size.Width * levelScale), (int)(image.Size.Height * levelScale)));
或者
g.ScaleTransform(levelScale, levelScale);
g.DrawImage(image, new Rectangle(0, 0, (int)(image.Size.Width), (int)(image.Size.Height)));
其中 g 是Graphics
对象。
我是否达到了 Win 表单应用程序功能的限制,或者我可能缺少什么?
任何和所有帮助表示赞赏,
提前致谢。