Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用多个控件时绘图速度较慢#_C#_Performance_Drawing - Fatal编程技术网

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

C# 在C中使用多个控件时绘图速度较慢#,c#,performance,drawing,C#,Performance,Drawing,一年多以来,我一直在尝试制作一款滚球游戏,我认为一个好的方法是将它变成一款龙与地下城的变体,来测试它,让它变得更加有血有肉。然而,使用DnD设置的固有问题是有很多事情需要跟踪,以至于一个人无法自己完成。因此,我想写一个C#程序来帮助我 当我尝试使用一系列PictureBox对象来表示地图上角色可以移动的空间时,我遇到了这个问题。我想使用PictureBoxes,因为这将允许我使用图像来表示占据给定空间的地形和角色。然而,我使用的地图大约是46 x 75 1英寸的正方形,总共3450个图片框。这可

一年多以来,我一直在尝试制作一款滚球游戏,我认为一个好的方法是将它变成一款龙与地下城的变体,来测试它,让它变得更加有血有肉。然而,使用DnD设置的固有问题是有很多事情需要跟踪,以至于一个人无法自己完成。因此,我想写一个C#程序来帮助我

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

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

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
我不确定他们做了什么,但他们确实帮了一点忙。尽管如此,我仍然看到了太多的滞后


我现在没有主意了。我可以使用更好的控件还是其他的绘图方式?提前感谢您的帮助

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


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

如果不首先以正确的方式绘制,您的
SetStyle
s将无法完成任何事情:覆盖
表单
OnPaint
并使用
DrawImage
而不是慢速,不可重叠的
PictureBox
es。@minitech:那么我是否必须停止使用PictureBox,或者我是否可以继续将它们与DrawImage一起使用?@Raevyn117:您必须停止使用
PictureBox
es,但这可能是一个很小的改变。(有一个非常简单的查找和替换类型解决方案,但不这样做可能会得到更干净的代码。)@minitech:有了这个解决方案,我将失去我在单击等事件控件中获得的非常好的功能。有没有一种方法可以替代PictureBox的绘制方式,或者会出现同样的问题?@Raevyn117:没有,没有办法。(这些框可以画在它们的父母身上,但它们每次都需要一个新的上下文[慢],并且仍然会出现在它们所画的任何一种方式的上方。)不过,如果你有一堆
矩形
的话,在表单上处理
鼠标向下
并不是很困难(你应该!)…@user2864740:我如何创建一个能够区分分幅的自定义控件,以便用户可以(比如)根据分幅中/分幅上的内容以不同的结果单击分幅?@Raevyn117您将处理自定义控件(绘制所有分幅)的单击事件。然后,您可以应用转换将这些坐标映射到您的实际模型上(读取:tiles),并决定如何操作。@user2864740:谢谢,我将尝试一下。现在我只需要研究如何制作自定义控件:)@TGH:谢谢您的及时回复,我非常感谢。也就是说,我不知道你建议怎么做,或者“将视图模型对象绑定到可见对象”意味着什么。我有一种感觉,这有点超出了我目前的C#诀窍。你能详细说明一下吗?