2012-06-13 28 views
1

由於性能原因,我正在研究使用VBO而不是即時模式。我正在創建一個充滿精靈的二維正射影像場景。我不想畫出離屏的精靈。我通過檢查相機的屏幕大小和位置來確定它們的位置。使用VBOs在OpenGL中進行簡單2D剔除

即時模式下,這很簡單;每個精靈都有繪製方法。使用VBO這似乎不重要;我一次渲染一個VBO的整個部分。對於我來說(我能想到的)將無法選擇不在屏幕上的渲染精靈。

+3

在CPU上動畫的動畫是否正確?另外,我們在談論什麼數字?如果你有例如幾百個精靈,然後撲殺幾乎不值得考慮(顯卡會爲你做,忘掉它)。 – Damon

回答

5

我只假設你確實在CPU上製作了精靈動畫,因爲這是根據你的問題唯一有意義的東西(否則,你將如何在最初的即時模式中繪製它們,以及如何你跳過畫一些)。

從性能的角度來看,AGP/PCIe的行爲非常像硬盤。帶寬很大,但訪問時間相當明顯。換句話說,做轉移是件痛苦的事情,但一旦你做了,再多幾千字節也沒有什麼區別。上傳500個精靈並上傳1000個精靈是同樣的事情。

既然你動畫在CPU上的精靈,你已經必須做一個轉移(glBufferSubDataglMapBuffer/glUnmapBuffer)每一幀,沒有其他辦法。

確保使用「新鮮」緩衝區,例如通過應用glBufferData(null) idiom。通過允許OpenGL繼續使用(繪製)緩衝區,同時爲您提供不同的緩衝區(不知道),避免了管道延遲。稍後當它完成繪圖時,它只是祕密地翻轉緩衝區並拋出舊的。這樣,你就可以實現良好的並行性(這對性能至關重要,比剔除幾千個頂點更重要)。此外,圖形卡在選擇幾何圖形時也相當不錯(這包括丟棄在生成碎片之前不在屏幕上的整個三角形)。數百?成千上萬的?十萬?沒有任何問題。讓顯卡去做。

除非你有一百萬精靈,其中一半是可見在同一時間,另一半是不是,這不是不可能連續寫入整個緩衝區和無枝不僅一樣快,但由於緩存和管道效應,速度更快。

+0

因此,基於文檔,我將使用GL_STREAM_DRAW_ARB使用標誌。這將表明VBO應該針對這種確切的情況進行優化。它是否正確? –

+0

是的。 「流」意味着「定義一次,使用一次或幾次」。這並不意味着你不能做別的事情,但這是你給司機的暗示(它可能會或者可能不會被尊重,有所作爲,這取決於司機,硬件和你的工作。例如,在使用正確的標誌和錯誤的標誌進行回讀時,我看到差異大約爲1:100)。另一半(「繪製」)暗示您打算從您的應用提供的數據中繪製。請注意,在後來的版本(如果我沒有記錯的話3.2版本),這個「提示」是一個很難的要求。 – Damon