为什么microsoft不将SetPixel()的实现更改为更快的实现?

时间:2010-11-08 18:09:03

标签: c# .net bitmap pixel

我对Bitmap类有疑问。如果要在位图上设置大量像素,则可以使用SetPixel方法,但速度非常慢。有很多关于如何使用LockBits方法等加快速度的文档,所以我创建了一个方法:SetFastPixel来加快它的速度。

然而,我真的对此感到困惑:为什么微软不会将SetPixel()的实现更改为更快的实现?换句话说,使用{是否有优势? {1}}而不是SetPixel方法?

6 个答案:

答案 0 :(得分:6)

SetFastPixel可能不起作用的情况:

  • 单色设备(八个像素打包成一个字节)
  • Planar devices(16色VGA卡有一个奇怪的内存布局,需要硬件帮助)
  • 索引调色板设备(SetPixel处理RGB到调色板索引映射)
  • 打印机(我不知道这将如何通过LockBits
  • 每个卡具有不同像素格式的多显示器配置

SetPixel旨在处理上述所有问题,但代价是速度慢。如果您愿意牺牲上述某些要点,或者您很乐意在应用程序中处理它们,那么您就可以通过LockBits绘制图像。

答案 1 :(得分:4)

要使处理特定位图格式的实现很容易,但是图像可以存储在内存中的方式有​​很多种,因此实现处理所有格式的解决方案要复杂得多。

例如,位图可以在存储器中正面朝上或颠倒存储,在线之间有或没有填充,每个像素有许多不同的位数。

实现这项工作只是为了让方法更快一点。一次设置一个像素本身就很慢,所以如果你想要速度,你不应该使用那个方法。

答案 2 :(得分:1)

无论如何实现,调用设置单个像素的方法本质上都很慢,因为对于每个调用,您必须计算和检查索引,转换像素格式等。

答案 3 :(得分:1)

Direct3D就是为此而创建的。尽管它的名字,它仍然可以做原始2D像素操作。一般来说,你这样做:

  • 创建Direct3D上下文和设备
  • 创建屏幕外表面
  • 锁定屏幕外表面,渲染到其显示缓冲区,解锁
  • 将屏幕外缓冲区复制到设备。

是的,它比GDI复杂得多,但它与硬件和驱动程序紧密耦合,因此您可以准确控制渲染的位置以及它如何显示在屏幕上。你再也不想用GDI做任何高性能的图形了。

答案 4 :(得分:0)

他们不在乎,因为大多数人不会那样使用它。 C#通常不用于渲染视频 - 如果你需要这样的东西,那么有更快的替代品。

答案 5 :(得分:0)

System.Drawing中的类只是GDI+中使用的C ++类的一个薄层。微软不打算公开一个通用接口(System.Drawing& GDI +),并且有两个应该以不同方式执行相同操作的类。