gpt4 book ai didi

C# PictureBox 控件闪烁/性能问题

转载 作者:太空狗 更新时间:2023-10-30 01:05:46 27 4
gpt4 key购买 nike

我目前在 Windows 窗体应用程序 中工作,并且正在制作一款游戏的 map 编辑器。我解决这个问题的方法是拥有一个中央 TabControl,其中每个 TabPage 包含一个自定义 PictureBox 控件,所有其他 UI 控件都在周围这个中央 TabControlPictureBox 使用其 Paint 事件绘制 map 上的所有内容,因此将具有多种尺寸、旋转和比例等的多个图像绘制到单个 PictureBox。到目前为止一切顺利。 TabPage 本质上用作 PictureBox 的 View 窗口,大小为 (1280x720)。

问题在于 map 的制作比例。屏幕上的平均(也是最大) map 大小约为 19200x10800px 并且可以在任何一点由数百个项目组成。当仅绘制大小为 19200x10800px 的背景图像时,PictureBox 在重绘时开始闪烁并使程序无法使用。由于 map 太大,您可以在它们周围平移,这就是闪烁真正显示的地方。此外,出于文件大小的考虑,我不想尽可能使用 19200x10800px 图像源,并且缩放后的图像质量根本不是问题。

我已经阅读了大量关于为什么会这样的阅读资料,并且觉得到目前为止我已经尝试了所有方法。到目前为止我试过:

  • 只有 1920x1080 的背景图片并将其放大 10 倍
  • 从一张 1920x1080 的图片开始,以编程方式调整它的大小并绘制这张图片
  • 将背景分成多个部分(我尝试了很多不同的数量)并仅绘制 View 窗口可以看到的部分(对小 (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 窗体应用程序功能的极限,或者我可能遗漏了什么?

感谢所有帮助,

提前致谢。

最佳答案

为了正式起见,我会回答我自己的问题,以防万一其他人想知道结果。

基于压倒性的共识,即 winforms 不是用来做我想用它做的事情的,我决定我必须转移到其他平台。向我推荐的是 WPF、DirectX 和 OpenGL,但经过广泛搜索后,我发现了我认为的最佳解决方案。

为了利用 DirectX 硬件加速的强大功能,MS 使您可以将 XNA 图形设备嵌入到 winforms 应用程序中。本质上,您可以创建以正常 winform 样式运行的自定义控件,这些控件可以访问更高质量的图形控件。以这种方式(需要一些额外的工作),我用处理所有绘图的自定义图形控件替换了我使用的图片框。这非常有效,而且从好的方面来说,我不必对我的开发时间造成太大的影响。

对于那些寻找更多信息的人,请参阅 this有进一步链接的问题应该有所帮助。再次感谢所有提出建议的人!

关于C# PictureBox 控件闪烁/性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17442276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com