2016-11-25 203 views
1

我使用桌面複製到屏幕上的內容複製到內存中的位圖。我收到桌面質地,然後創建一個臨時的質感,使用CopyResource到桌面的紋理複製到臨時紋理,最後調用ID3D11DeviceContext::Map訪問分期質地位,並複製它們。幾乎如這裏所描述的一樣:https://stackoverflow.com/a/27283837/825318ID3D11DeviceContext ::地圖性能下降

的問題是,Map通話需要花費大量的時間 - 用於大型顯示​​器的分辨率,如4K它可能需要長達100ms的每次通話,這是不可接受的,因爲我需要確保30 fps的速度。

有沒有什麼辦法讓紋理的內容更快?如果沒有,有沒有辦法提供我自己的映射地址指針,以便系統在那裏複製紋理數據?由於

+1

[ID3D11DeviceContext :: Map](https://msdn.microsoft.com/en-us/library/windows/desktop/ff476457(v = vs.85).aspx)文檔討論性能損失,並建議適當的策略和頁面的結尾。其中之一是使用易失性指針。 – 2016-11-25 16:12:22

+0

謝謝,但是這隻適用於只寫表面,而我的任務是從表面讀取數據。 – Isso

回答

3

最有可能的地圖操作等待的CopyResource完成。您可以使用GPUView來驗證這一點。如果是這種情況,那麼推薦的解決方案是接受延遲而不是幀率。處理這個問題的方法是保持至少3層分期的紋理和通過以下方式在它們之間旋轉:

幀#1 - 開始複製的資源,以舉辦紋理#1

幀#2 - 開始複製資源分期紋理#2

幀#3 - 開始複製資源到分段紋理#3和映射分段紋理#1訪問數據

幀#4 - 開始複製資源到分段紋理#1(舊的內容應該已經被保存)並映射分級紋理#2以訪問數據

這樣你可以保持30 FPS,但引入〜130毫秒的延遲,這是大多數應用程序可以接受的。

+0

謝謝!不幸的是我需要最小的延遲,所以你的解決方案並沒有真正解決我的問題,但這是一個聰明的方法,GPUView似乎是一個非常有用的工具。因此我向你獎勵賞金。 – Isso

+1

如果您想要最小延遲,那麼您基本上需要將CPU與GPU同步,以確保複製完成後立即讀取紋理。這意味着GPU和CPU不能並行工作,這正是您在原始問題中所看到的。 如果我錯過了一些東西,請讓我知道它看起來像你試圖滿足兩個相反的要求。 – moradin