首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有数千个控件呈现性能的Winform

具有数千个控件呈现性能的Winform
EN

Stack Overflow用户
提问于 2014-02-12 20:30:54
回答 2查看 1.9K关注 0票数 0

十年前,我制作了一个简单的俄罗斯方块游戏来学习.NET和WinForms。我创建了一个由标签控件组成的10×30网格。这些标签链接到一个ImageList,其中包含每个块的图像。几周前,我的朋友们要求为局域网派对提供一个俄罗斯方块游戏,所以我拿起了我的俄罗斯方块游戏,我复制了网格和标签,以支持10个玩家。

游戏核心运行得很完美。然而,有3000多个标签,渲染开始困难。

下面是我的问题:有什么方法可以改善我的应用程序的呈现吗?

我可以为其他用户控件替换标签,但我希望避免陷入DirectX / OpenGL绘图(即使这是最好的解决方案,我也没有足够的时间去研究学习曲线)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 20:37:36

这是一个非常缓慢的方式,你不能真的期望它执行得很快。您可以做的是只使用一个控制,而不是数千-它将作为一个绘图画布。

您应该重写控件上的on画图事件,并以这种方式绘制游戏状态。您将在事件args中找到一个图形对象,并且使用像FillRectangle这样的函数,您应该能够绘制所有的东西。

虽然这也会导致一些闪烁,但WinForms最初并不打算用于这类东西--但对于您的情况来说应该是可以的。

我还理解这会改变您的概念,并且需要进行大量的编码更改,但它比directx / opengl路由容易得多。

祝好运!

票数 3
EN

Stack Overflow用户

发布于 2014-02-13 06:53:39

窗体上的每个控件都有自己的句柄,并被视为单独的窗口。窗口不会很好地处理大量的控件(在窗口方面,WPF不对每个控件使用单独的窗口句柄,而是对整个窗口使用一个)。

3000+控件不是一个好主意,您也知道这一点,但是让我们尝试应用一个创可贴,尽管我们对您的应用程序知之甚少!

  • 尽量不要使用透明的BackColor,否则会引发额外的油漆调用。控件不是真正透明的,它查看它的父控件的背景,并将背景复制到它自己(OnPaintBackground)上。在示例中对几千个控件重复这些操作,您可以看到这种复合。(当然,如果你正在使用它)
  • 您是否隐藏了任何控件,如果是,您是使用可视属性还是使用控件的BackColor来实现这一点?通过使不必要的控件不可见,您可以节省不必要的油漆。注意隐藏控件与禁用控件的效果。仍然绘制禁用控件。
  • 虽然它不会影响渲染速度,但如果您有任何闪烁,我会查看双缓冲。使用XP以后引入的WS_EX_COMPOSITED标志(据报道也适用于Windows8),这将确保控件的双重缓冲。它包含在以下问题中:Winforms双缓冲
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21738926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档