2009-08-27 26 views
4

如何在Windows應用程序中進行滾動處理,該應用程序的渲染計算耗費大量圖形?例如,如果我的渲染的聲音的波形圖,從一個peakfile處理所述波形之後,我應:Windows應用程序中的滾動緩衝

  • 渲染整個圖形表示到內存中的GDI表面上,然後只需要一個可滾動的控件來改變渲染區域的開始/結束?

  • 僅渲染波的可見部分。在一個單獨的線程中,處理進入視圖的graphc的所有新塊。

  • 呈現波的可見部分,加上緩衝區。這樣,用戶看到波形的「空白」或「當前渲染」部分的機會就越小。但是,如果用戶快速滾動到較遠的區域,整個部分將保持空白,直到渲染完成。

問題是,許多應用程序以不同的方式處理它。

例如:

使用Adobe Acrobat - 滾動過程中呈現的空白頁面,除非頁面是在緩存中。任何在文檔渲染區域內可見的頁面都會在一個單獨的線程中呈現,並呈現opon完成。

Microsoft Word - 基本上與上面相同。文檔分爲不同的頁面,因此每個頁面都按需處理/渲染並添加到緩存中。

Internet Explorer - 未知。看起來整個「網頁」都是在圖形內存中呈現的,無論它消耗多少「屏幕」圖形數據。理論上,對於滾動10或15個屏幕長度的網頁,這可能意味着50-60MB的圖形內存消耗。任何具有WebKit或FireFox經驗的人都可以解釋渲染引擎是否傾向於消耗大量內存,或嘗試渲染頁面的「動態」以節省內存?

如果有幫助,我的應用程序基於C#,.NET 3.5和WinForms。

回答

1

這是一種複雜性與用戶體驗的權衡。您的第三個選項將爲您提供最佳的用戶體驗(他們可以立即開始查看並開始工作)。它也是最複雜的代碼(將花費最長的時間來開發,最多的bug被殺死)。

「正確的」解決方案取決於「昂貴」的昂貴程度以及用戶羣的需求。我會選擇複雜程度最低的選項,以提供滿足大部分客戶的用戶體驗:

使其儘可能地複雜,但不會比這更復雜。

1

我認爲這實際上是一種內存使用與處理器使用權衡的折衷。假設您有足夠的內存,您的第一個選擇(將整個波形渲染到適當大小的畫布上,然後移動該畫布只顯示可見的窗口部分)可能是最好的方法。在初始渲染延遲之後,用戶體驗將會平滑無縫。

如果您沒有足夠的內存用於此目的,那麼您必須即時渲染可見部分。我已經多次編寫這個應用程序(WAV數據瀏覽器),並且通常GDI +足夠快速地實時渲染WAV數據的部分(甚至是大部分)(幀速率高於30 fps,這可以產生完美平滑的動畫) 。然而,關鍵是不要將每個樣本值都作爲一個單獨的點 - 這將會很慢。你想要做的是對於X軸上的每個像素,掃描相應的WAV樣本塊以獲取最小和最大樣本值,然後在這些值之間渲染一條線。

相關問題