2010-04-18 58 views
5

我正在開發一個應用程序,需要從openGL應用程序的前端緩衝區讀回整個幀。我可以劫持應用程序的opengl庫並將我的代碼插入到swapbuffers中。目前,我成功地使用了一個簡單但令人痛苦的慢glReadPixels命令,沒有PBO's。使用多個PBO的來自opengl前端緩衝區的異步回讀

現在我讀了關於使用多個PBO來加快速度。雖然我認爲我已經找到足夠的資源來實際編程(並不難),但我仍然有一些操作問題。我會做這樣的事情:

  1. 創造了一系列在我swapBuffers PBO的
  2. 使用glReadPixels(例如3)覆蓋從前臺緩衝區讀取數據的PBO(應該是快和非阻塞,右?)
  3. 創建一個單獨的線程來調用glMapBufferARB,一個glOadPixels之後每個PBO一次,因爲這將阻塞,直到像素在客戶端內存中。
  4. 從步驟數據3.

現在我最關心的當然是在步驟2和3。我讀到了PBO的是無阻塞使用glReadPixels,如果我發出新會這是一個問題那之後的opengl命令非常快?這些opengl命令會阻止嗎?或者他們會繼續(我的猜測),如果是這樣,我猜測只有交換緩衝區可能是一個問題,這一個停滯或將從前緩衝區glReadPixels比交換快很多倍(大約每個15-> 30ms),或者最糟糕的情況場景,當glReadPixels仍然在向PBO讀取數據時,會執行swapbuffers嗎?我目前的猜測是這個邏輯會做這樣的事情:複製FRONT_BUFFER - >在VRAM中的通用位置,複製VRAM-> RAM。但是我不知道哪兩個是真正的瓶頸和更多,對正常的opengl命令流有什麼影響。

然後在第3步。在與正常opengl邏輯分離的線程中異步執行此操作是否明智?目前我認爲不是,看來你必須恢復緩衝區操作到正常後,這樣做,我不能在原始代碼中安裝同步對象來臨時阻止這些。所以我認爲我最好的選擇是在讀出它之前定義一個特定的swapbuffer延遲,例如在同一個線程中調用PBO i%3上的glReadPixels和PBO(i + 2)%3上的glMapBufferARB,導致延遲2幀。另外,當我調用glMapBufferARB在客戶端內存中使用數據時,這會成爲瓶頸還是glReadPixels(異步)成爲瓶頸?最後,如果你有更好的想法來加速在opengl中GPU的幀回讀,請告訴我,因爲這是我當前系統中的一個痛苦的瓶頸。

我希望我的問題很清楚,我知道答案可能也會在互聯網上的某個地方,但我大多想出了使用PBO將結果保留在視頻內存中並在那裏處理的結果。我真的需要讀回前端緩衝區到RAM,並且我沒有發現有關性能的任何明確解釋(我需要,我不能依賴「更快」,我需要解釋爲什麼它更快)。

謝謝

回答

3

您確定要從前臺緩衝區中讀取嗎?您不擁有此緩衝區,並且根據您的操作系統,它可能會被破壞,例如,通過其上的另一個窗口。

爲您的使用情況下,人們通常做

  • 平局ň
  • 開始PBO從後臺緩衝區讀取N個
  • 平局N + 1
  • 開始PBO讀N + 1
  • 同步PBO讀取N
  • 流程N
  • ...

來自單個線程。

+0

我知道我想從前端緩衝區(或者在通話之前從後臺緩衝區讀取)讀取,但這不是問題。你的回答可以幫助我解決關於線程問題,而我其實已經有點懷疑了。但是我真的很想知道,當你這樣做時,屏幕背後發生了什麼,什麼被阻擋,什麼不會,嘗試使用多於兩個PBO,......是合理的。無論如何感謝您的答案:)! – KillianDS 2010-04-19 14:04:50

+0

使用後臺緩衝區是更好的選擇。 幕後發生的是駕駛者依賴。通常情況下,異步讀取會發布到GPU fifo,並在GPU處理完它後進行處理。完成後,GPU將發回一個令牌,告訴驅動程序操作已完成 - 這將解除對mapBuffers的阻止。對於任何更具體的內容,您都必須與nVidia/AMD工程師交談。 使用兩個以上的緩衝區可能是有意義的,具體取決於您想要「飛行中」的幀數。只需實現它可配置,並進行基準測試。 – eile 2010-04-20 07:14:44