簡體   English   中英

為什么microsoft不將SetPixel()的實現更改為更快的實現?

[英]Why doesn't microsoft change the implementation of SetPixel() to an implementation that's faster?

我對Bitmap類有疑問。 如果要SetPixel圖上設置大量像素,則可以使用SetPixel方法,但速度非常慢。 關於如何使用LockBits方法等加快速度,有很多文檔,所以我創建了一個方法: SetFastPixel來加快它的速度。

然而,我真的很困惑: 為什么微軟不會將SetPixel()的實現更改為更快的實現? 換句話說,使用SetPixel而不是LockBits方法是否有優勢?

SetFastPixel可能無法工作的情況:

  • 單色設備(八個像素打包成一個字節)
  • 平面設備 (16色VGA卡具有奇怪的內存布局,需要硬件幫助)
  • 索引調色板設備( SetPixel處理RGB到調色板索引映射)
  • 打印機(我不知道這將如何通過LockBits工作)
  • 多顯示器配置,其中每張卡具有不同的像素格式

SetPixel旨在處理上述所有問題,但代價是速度慢。 如果您願意犧牲上述某些要點,或者您很樂意在應用程序中處理它們,那么您就可以通過LockBits繪制圖像。

要使處理特定位圖格式的實現很容易,但是圖像可以存儲在內存中的方式有​​很多種,因此實現處理所有格式的解決方案要復雜得多。

例如,位圖可以在存儲器中正面朝上或者倒置存儲,在線之間有或沒有填充,每個像素具有許多不同數量的位。

實現這只是更多的工作,值得使方法更快一點。 一次設置一個像素本身就很慢,所以如果你想要速度,你不應該使用那種方法。

無論如何實現,調用設置單個像素的方法本質上都很慢,因為對於每個調用,您必須計算和檢查索引,轉換像素格式等。

Direct3D就是為此而創建的。 盡管它的名字,它仍然可以做原始2D像素操作。 一般來說,你這樣做:

  • 創建Direct3D上下文和設備
  • 創建一個屏幕外表面
  • 鎖定屏幕外表面,渲染到其顯示緩沖區,解鎖
  • 將屏幕外緩沖區復制到設備。

是的,它比GDI復雜得多,但它與硬件和驅動程序緊密耦合,因此您可以精確控制渲染的位置以及它如何顯示在屏幕上。 你再也不想用GDI做任何高性能的圖形了。

他們不在乎,因為大多數人不會那樣使用它。 C#通常不用於渲染視頻 - 如果你需要這樣的東西,那么有更快的選擇。

System.Drawing中的類只是GDI +中使用的C ++類的一個薄層。 微軟不會公開一個通用的接口(System.Drawing和GDI +),並且有兩個應該以不同方式執行相同操作的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM