代码之家  ›  专栏  ›  技术社区  ›  Camilo Martin

定期返回位图的函数是否应该重用它们?

  •  0
  • Camilo Martin  · 技术社区  · 14 年前

    bitmap 在面板中用作背景,有时我不得不调用它来创建基于参数的新背景。

    (因为这个面板有两个绘图功能(背景不需要像前景那样频繁地改变),所以这不是在屏幕上绘图的问题 Paint 事件。)

    所以我的问题是: 如果我将旧的背景缓冲区作为参数,并在其上绘制,而不是每次调用函数时都创建一个新的位图,是否会获得(不仅仅是象征性的)性能提升?

    2 回复  |  直到 14 年前
        1
  •  2
  •   NG.    14 年前

    是的,我想你会得到很多。

    首先,你的内存限制会更好。如果您一直在创建位图,是什么阻止您的客户端代码保留它们并耗尽内存?

    编辑 您还可以考虑维护自己的位图池,而不需要调用者传入现有的位图池。确保您记录了位图是您自己的,并且调用者应该将它们视为只读的(您能将其包装在某个不可变的对象中吗?)。这样,您就可以在自己的时间创建/处理,而不需要客户提供任何东西。

        2
  •  2
  •   Hans Passant    14 年前

    是的,在绘制时运行的代码中重新创建位图通常成本太高,并且绘制速度太慢。保留位图的副本可以解决速度问题,代价是需要更多内存。

    请注意,标准Control.BackgroundImage属性对此可用,请考虑使用它。您只需要添加代码,当需要不同背景图像的条件更改时,更新该属性(并调用Invalidate)。绘图是自动的。

    次要的效率考虑是预先缩放位图以精确地适应控件的ClientSize,避免在绘制时重新缩放位图。节省了很多钱,尤其是位图很大的时候。但需要重写OnResize方法,以便重新生成缩放的位图。如果在调整窗体大小时绘制速度过慢,则需要连接窗体的ResizeEnd事件。

    而创建格式为32bpppargb像素格式的位图,它在大多数视频适配器上的绘制速度大约是其他格式的10倍。