windows 窗体刷新 - 我怎样才能使它更平滑?
Posted
技术标签:
【中文标题】windows 窗体刷新 - 我怎样才能使它更平滑?【英文标题】:windows form refresh - how can i make it smoother? 【发布时间】:2020-07-06 10:51:36 【问题描述】:我在窗口窗体上绘制了一个小迷宫,并在每次按键事件时重新绘制它。我怎样才能使它更顺畅?绘图持续约。一秒钟,当您输入箭头按钮时,您会在表单上看到短暂的闪烁。
public void Draw_Labyrinth()
this.Update();
this.SuspendLayout();
Controls.Clear();
for (int i = 0; i < list_Elements_Y.Count; i++)
for (int j = 0; j < list_Elements_Y[i].list_Elements_X.Count; j++)
PictureBox pb = new PictureBox();
pb.Location = list_Elements_Y[i].list_Elements_X[j].position;
pb.Name = list_Elements_Y[i].list_Elements_X[j].name;
pb.Size = list_Elements_Y[i].list_Elements_X[j].size;
if (pb.Location == characterPosition)
pb.Image = Properties.Resources.character;
else if (pb.Name == "item")
pb.Image = Properties.Resources.item;
else if (pb.Name == "wall")
pb.Image = Properties.Resources.wall;
Controls.Add(pb);
Application.DoEvents();
this.Update();
Application.DoEvents();
this.ResumeLayout();
非常感谢!
【问题讨论】:
您是否将DoubleBuffered
设置为true?
您可能正在逐个绘制每个精灵,尝试将静态环境批处理为一个图片框。
直接分段绘制到单个图片框...而不是使用一系列图片框控件
我将 DoubleBuffered 设置为 true,这行得通!现在好多了!不完美,但更好 - 谢谢
“重新绘制”意味着(对于大多数人)“在单个设备上下文/图片/位图上绘制”,代码显示重新创建了一大堆控件。绝对不会期望创建控件会以惊人的速度工作(绝对不会期望每次击键都会发生),创建大量控件可能会很慢。
【参考方案1】:
WinForms 中的闪烁通常可以通过将DoubleBuffered
设置为true
来解决(或大大改善)。
这可以在 VS 设计器中完成,也可以在 Form
构造函数中完成。
整整一秒钟的绘图操作似乎过多。因此,如果您可以对其进行优化,那将是一个好主意。
【讨论】:
@rfmodulator:不,这是概念性的。重新创建整个树的事实实际上是它如此缓慢的部分原因。所以,这基本上就是您要暗示的好主意。这只是改进建议 - 重新启动程序也是一种绘图形式,你肯定会反对它;-) @Stefan 抱歉,我们又吵什么了? @rfmodulator:对不起,我不是在争论,我只是想帮助你;通过说阿列克谢有一个观点,也许是直言不讳,但仍然有效——这不仅仅是语义上的。您最后的陈述表明应该提高性能 - 关键部分是:重新创建控件 - 这是“绘图”的一个大超集,因此比实际的“绘图”慢得多。 创建控件不仅仅是绘图。以上是关于windows 窗体刷新 - 我怎样才能使它更平滑?的主要内容,如果未能解决你的问题,请参考以下文章
我有一个工作布尔函数,但我的代码非常笨拙。我怎样才能使它更顺畅? [关闭]
怎样才能让winform窗体在任务栏里面不显示,用ALT键+TAB键也看不到,但是程序还在运行!
UIImagePickerController 允许选择方形图像。但是我怎样才能使它成为 16:9?