2011-08-03 25 views
5

我正在用C++編寫一個程序,它通過UDP套接字獲取4維點數據,然後將數據繪製在6個獨立的2D散點圖中。例如,如果我們命名尺寸:A,B,C,D,那麼六個二維圖將是AxB,AxC,AxD,BxC,BxD和CxD。在幾個小時的過程中,該計劃累計達到50K點。使用OpenGL在C++中繪製大量數據點的散點圖的最佳方法

目前我使用即時模式繪製每個點一次。我不清除繪製調用之間的緩衝區,因此先前繪製的點會一直存在,直到緩衝區被清除。我對這種方法不滿意,因爲即時模式很慢並且不推薦使用。當我必須清除緩衝區時,如窗口重新調整大小時,我會丟失先前繪製的所有數據。我想提出一個解決方案,允許在清除緩衝區後保持數據持久性。此外,如果劇情可以很容易地與窗口重新調整大小一樣,那也不錯。

我想過爲每個座標系維護一個頂點數組(2維),但這需要6個獨立的數組,並且需要3次維持一個包含所有4維的數組的內存。

我以正確的方式思考這個問題嗎?什麼是適當的解決這個問題?

最終目標是讓應用程序儘可能接近實時地顯示數據。

編輯當它們進來時,是否可以繼續繪製點,當我需要調整屏幕大小時,抓住屏幕圖像,然後顯示該圖像的大小調整版本?

回答

5

使用頂點緩衝區對象可以增加速度渲染,因爲要繪製的幾何圖形可以直接存儲在圖形卡內存中。但是,就你而言,如果數據總是變化,我不能告訴你這種方法是否會比即時模式快,因爲每次數據更改時可能必須重建頂點數組對象。如果只添加點數,也許可以讓多個VBO對點進行分組,並使用即時模式呈現最後接收的點,直到您可以創建新組。例如,如果您獲得了100054分,也許您可​​以製作10組10000分,並在即時模式下呈現最後54分。

關於內存問題,我認爲有可能在圖形卡頂點存儲4個元素 - 然後你可以使用不同的頂點着色器來選擇頂點的哪些組件作爲渲染座標。使用這種技術,內存使用量只會是您收到的兩倍:一個爲您接收數據,一個爲頂點緩衝區對象。

+2

VBOs應該至少不會比客戶端陣列慢,並且肯定比立即模式更快。它不僅是內存拷貝,也是VBO(和一般頂點數組)所用的驅動程序調用開銷。 –

+0

人們可能會逃避在'glVertexPointer'中使用不同的'stride'和'pointer'參數,而不必爲不同的視圖設置不同的頂點着色器。 – user786653

+0

@Christian感謝您的評論,我不確定。 – neodelphi