[英]Why doesn't microsoft change the implementation of SetPixel() to an implementation that's faster?
我對Bitmap類有疑問。 如果要SetPixel
圖上設置大量像素,則可以使用SetPixel
方法,但速度非常慢。 關於如何使用LockBits
方法等加快速度,有很多文檔,所以我創建了一個方法: SetFastPixel
來加快它的速度。
然而,我真的很困惑: 為什么微軟不會將SetPixel()的實現更改為更快的實現? 換句話說,使用SetPixel
而不是LockBits
方法是否有優勢?
SetFastPixel
可能無法工作的情況:
SetPixel
處理RGB到調色板索引映射) LockBits
工作) SetPixel
旨在處理上述所有問題,但代價是速度慢。 如果您願意犧牲上述某些要點,或者您很樂意在應用程序中處理它們,那么您就可以通過LockBits
繪制圖像。
要使處理特定位圖格式的實現很容易,但是圖像可以存儲在內存中的方式有很多種,因此實現處理所有格式的解決方案要復雜得多。
例如,位圖可以在存儲器中正面朝上或者倒置存儲,在線之間有或沒有填充,每個像素具有許多不同數量的位。
實現這只是更多的工作,值得使方法更快一點。 一次設置一個像素本身就很慢,所以如果你想要速度,你不應該使用那種方法。
無論如何實現,調用設置單個像素的方法本質上都很慢,因為對於每個調用,您必須計算和檢查索引,轉換像素格式等。
Direct3D就是為此而創建的。 盡管它的名字,它仍然可以做原始2D像素操作。 一般來說,你這樣做:
是的,它比GDI復雜得多,但它與硬件和驅動程序緊密耦合,因此您可以精確控制渲染的位置以及它如何顯示在屏幕上。 你再也不想用GDI做任何高性能的圖形了。
他們不在乎,因為大多數人不會那樣使用它。 C#通常不用於渲染視頻 - 如果你需要這樣的東西,那么有更快的選擇。
System.Drawing中的類只是GDI +中使用的C ++類的一個薄層。 微軟不會公開一個通用的接口(System.Drawing和GDI +),並且有兩個應該以不同方式執行相同操作的類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.