2009-06-12 20 views
4

當我在C#中創建一個基於圖塊的地圖編輯器時,我傾向於遍歷X,Y軸並調用Graphics.DrawImage()來將單個圖塊從地圖塊位圖移動到地圖位圖上。這個過程需要幾秒鐘才能完成,因此我只在加載新地圖或更改其地圖集時執行一次。從那裏進行的任何編輯都是相對較快的只有編輯後的圖塊。這個瓦片阻擋器可以更快嗎?

現在,我今天早些時候回頭想起了我的選擇。 Graphics.DrawImage()是三個中的唯一一個(其他是DrawImageUnscaled和DrawImageUnscaledAndCropped(?)),允許指定源原點。 DrawImageUnscaled()很多,太多更快,但總是從源位圖的左上角傳出。

在與QuickBasic PSET與POKEing顯存,或VB6的PSET的與WinAPI的的SetPixel速度形成鮮明對比,簡單的GET/SetPixel循環是快如DrawImageUnscaled呼叫,但做了裁剪,只有的DrawImage會否則。

現在速度已經夠快了,但我想知道直接圖像處理是如何加快速度的呢? LockBits也許,我知道的一個功能什麼也沒有?

+1

這實際上並不是您問題的答案,但您可以通過定義圖像的整個矩形 - > X,Y,寬度,高度來提高DrawImage的速度。在我的測試中,我實現了大約20%的加速。 – 2013-04-02 07:30:56

回答

1

軟件blitting似乎是一個嚴重的瓶頸。我會認真的建議尋找硬件加速繪圖這樣的任務。

+0

至少脖子明顯變寬了。 – Kawa 2009-06-12 19:14:29

1

簡單的GET/SetPixel循環是快速 作爲DrawImageUnscaled呼叫

那麼你肯定做錯了什麼。 GetPixelSetPixel方法有相當的開銷,使用任何DrawImage方法應該快100倍(除非也許如果你的瓷磚非常小,像2×2像素)。

與其名稱相反,DrawImageUnscaled方法在不調整大小的情況下不繪製。相反,它使用圖像的PPI設置將它們縮放到相同的測量值。這意味着如果你有一個設置爲100 PPI的位圖,並在設置爲50 PPI的位圖上繪製它,它將被調整爲雙倍大小。

如果您以不變的大小繪製圖像,則可以更改Graphics對象中的質量設置以調整速度。例如,您可以將InterpolationMode屬性設置爲NearestNeighbor,以防止其進行任何插值。可以使用LockBitsUnlockBits來直接訪問位圖的像素數據。