【问题标题】:winforms apps - best way to handle images for performancewinforms 应用程序 - 处理图像以提高性能的最佳方式
【发布时间】:2011-05-24 22:56:26
【问题描述】:

可能是一个糟糕的标题,但我正在开发一个 winforms 应用程序,并且一切顺利,直到我开始进行不同大小的可用性测试。

我注意到调整大小事件中控件的“重绘”会非常缓慢。我搜索了一下,发现 splitcontainers 和 dockstyle fill 效果不好,所以我改变了我的方法,性能有所提高,但仍然很慢。

事实证明,我的用户控件上的背景图片导致了延迟,这让我想知道什么是最好的做法?我有几个大约 1024x768 的不同渐变,设置为 sizemode 拉伸。

我的临时解决方法是用纯黑色替换漂亮的渐变背景。但这并不能使事情看起来那么美好。似乎如果我有两个不同大小的背景图像并在 form_resize 上交换它们,那将是最有效的,但有很多时候我会以艰难的方式做事,因为我不知道更好。所以我想我会在这里问。这仅适用于 winforms。我会尽可能为我的 wpf/sl 东西导出矢量。

【问题讨论】:

  • 为什么你的渐变是 1024x768?你有没有试过把它们做成 16x16 之类的?
  • 我将其调整为 16x12px 并将其设置为背景图像拉伸。它仍然闪烁并且重绘我的两个并排堆叠的数据网格非常慢。
  • 太糟糕了,希望它会有所帮助。

标签: winforms performance image


【解决方案1】:

渐变图是不是很具体?如果只是线性渐变,不能自己画背景吗?

在用户控件中,像这样添加 OnPaint 覆盖:

    protected override void OnPaint(PaintEventArgs e)
    {
        Brush brush = new LinearGradientBrush(
            Point.Empty,
            new Point(0, this.Height),
            Color.Yellow,
            Color.Green);

        e.Graphics.FillRectangle(
            brush, e.ClipRectangle);
    }

【讨论】:

  • 我会尝试这个并更新,但我试图让项目使用 2.0 框架(可能应该提到这一点),我很确定 lineargradientbrush 出现在 3.5 sp1 中。
  • @TWood 从 1.0 开始就在 .net 中,因此可以安全使用。祝你好运!
  • 埃德温,你的例子真的很有帮助。在对象创建期间我也必须调用它以获得最佳的运行时重绘性能:SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True)
【解决方案2】:

尝试在带有渐变的控件上将BackgroundImageLayout 属性设置为“无”。这通常会带来适度的性能提升

【讨论】:

  • 那么我需要一个巨大的超大渐变吗?我使用拉伸是因为它允许我在所有尺寸下使用相同的渐变。我只是将渐变设置为 3300x2800 并将 backgroundimagelayout 设置为无。不幸的是,它并没有太大变化。
猜你喜欢
  • 2015-08-04
  • 2019-06-14
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多