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?

UICollectionView 太宽。我怎样才能使它成为设备的宽度?

鼠标拖动选择不适用于触摸设备。我怎样才能使它成为可能?