最佳化 C# 點陣圖操作:慢 SetPixel
和 GetPixel
簡介
C# 中用於點陣圖操作的內建 GetPixel
和 SetPixel
方法非常慢,尤其是在處理較大影像時。本文提出了顯著增強性能的卓越替代方案。
高效能替代品
三種主要方法比標準函數提供了顯著的速度提升:
DirectBitmap 類別: 此自訂類別提供對位圖資料的直接、非託管訪問,消除了鎖定和複製的開銷。 它提供了直觀像素操作的 GetPixel
和 SetPixel
方法。
LockBits 方法: 此內建方法將位圖的一部分鎖定在記憶體中,以便直接存取其原始資料。 雖然比 SetPixel
/GetPixel
更快,但它需要明確鎖定和解鎖,從而引入較小的效能成本。
不安全程式碼區塊:這種方法利用不安全指標進行直接記憶體操作。 雖然可能是最快的,但它需要仔細處理以防止記憶體損壞;此方法最適合經驗豐富的開發人員。
效能基準
效能因影像大小和具體操作而異。 一般來說,對於較大的點陣圖,DirectBitmap
優於 LockBits
,且顯著優於 SetPixel
/GetPixel
。 下表說明了性能差異:
Method | 4x4 | 16x16 | 64x64 | 256x256 | 1024x1024 | 4096x4096 |
---|---|---|---|---|---|---|
DirectBitmap | 2 | 28 | 668 | 8219 | 178639 | |
LockBits | 2 | 3 | 33 | 670 | 9612 | 197115 |
SetPixel | 45 | 371 | 5920 | 97477 | 1563171 | 25811013 |
程式碼範例:DirectBitmap
DirectBitmap
類別簡化了像素存取:
<code class="language-csharp">public void SetPixel(int x, int y, Color colour) public Color GetPixel(int x, int y)</code>
使用範例:
<code class="language-csharp">var dbm = new DirectBitmap(width, height); dbm.SetPixel(x, y, Color.Red); Color c = dbm.GetPixel(x, y);</code>
結論
為了獲得大位圖的最佳效能,DirectBitmap
類別提供了一個引人注目的解決方案,與傳統方法相比,速度顯著提高。 LockBits
在速度和易用性之間實現了平衡折衷,而不安全的程式碼雖然可能最快,但需要仔細實施。
以上是除了「SetPixel」和「GetPixel」之外,如何加快 C# 中的點陣圖操作速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!