2011-03-21 60 views
6

我正在創建一個處理非常大的圖像文件的cad查看器,並且我正在儘可能優化幀率和內存佔用空間。C#GDI +/System.Drawing.Graphics - 創建一個緩衝區並手動blitting?

它使用GDI +渲染到面板上。

目前的缺陷是圖像渲染。我使用的一些文件參考圖像特別大(8000x8000像素)。我已經優化了內存使用情況,只有在它們變得可見時加載它們,並在它們不存在時將它們處理掉。這樣可以減少程序運行內存不足的可能性,但會妨礙圖像經常加載和卸載;然而渲染圖像本身(context.DrawImage)仍然帶來非常大的開銷。

我現在正在探索如何將圖像分塊成更小的緩衝區,渲染緩衝區(通常小得多),然後在縮放級別發生顯着變化時刷新/重建緩衝區。

問題是,我無法在GDI中找到這方面的任何條款。任何人都可以建議我如何實現它?

回答

0

GDI歸因於Direct3D,因爲3D元素無論如何都進入了方程。圖像變成單個縮略圖和更大的瓷磚,根據需要裝入/退出。

2

我不認爲GDI是爲圖像的高速更新而設計的。如果您嘗試滾動圖像並在每次移動時跟蹤鼠標,請嘗試移動圖像的各個部分並填寫由移位開啓的空間。基本上重用程序員在平滑滾動/平移圖形時使用的技巧,因爲CPU的速度較慢且RAM很小。

2

如果您正在創建一個需要高幀速率並且正在尋找建議的新圖形應用程序,那麼我建議放棄GDI +並使用WPF。 WPF使用硬件加速並支持保留模式圖形;這比GDI +的工作性能要好得多。

如果有一些限制,禁止WPF,請解釋你的問題。這是相關的,因爲這些限制也會影響GDI +繪圖。

0

我在開發自己的GIS應用程序時遇到了類似的問題。我發現的最好的解決方案(即使使用WPF時)是平鋪大圖像並僅顯示可見的部分。這是說,我會切換到WPF不僅出於上述答案中給出的原因,而且還提供良好的成像支持。請參閱this鏈接以獲取更多信息