簡體   English   中英

在Texture2D之間進行復制的最快方法

[英]The fastests way to copy to and from Texture2D

由於某種原因,我必須從紋理復制到緩沖區,然后將其重新加載回紋理。 源紋理是來自解碼器的紋理,目標紋理是將要渲染的紋理。 (據我所知)最簡單的方法是執行以下操作:

  1. 解碼器tex( ID3D11Texture2D
  2. 使用臨時紋理( Usage = D3D11_USAGE_STAGING
  3. CopyResource到臨時紋理
  4. '地圖'
  5. memcpy _s進行緩沖
  6. Unmap

另一方面,它向后退

  1. 使用臨時紋理( Usage = D3D11_USAGE_STAGING
  2. Map
  3. 來自緩沖區的memcpy_s
  4. Unmap
  5. CopyResource到渲染器紋理

效果很好,但是我感覺我並沒有做到盡可能高效(除了我來回復制數據的事實外)我是否必須使用臨時紋理? 是否可以調整解碼器/渲染器紋理標志(BindFlags?)或地圖的D3D11_MAP枚舉以跳過復制到過渡紋理的操作?

EDIT001:好的,這里有技術細節。 有一個解碼器,本質上是Intel Media SDK解碼器,它對從解碼類外部提供的(雙關)數據進行解碼。 因此,它接收一個緩沖區,(異步地)執行其操作,然后返回(通過SyncOperation,如果我還記得方法名的話)一個表面,該表面實際上是在DX紋理下由Intel分配器管理的。 我同步接收和復制紋理,但是我想,只要稍作努力,就可以異步完成它。 表面起源於一個池,因此,使用紋理不會停止解碼器繼續工作。 復制的數據駐留在保留在環形緩沖區中的結構中,視頻渲染器從環形結構中饋入。 就我所知(就是我要注意的一點),對GPU並行性沒有害處。

如果必須進行讀寫操作,則沒有快速的方法,可以通過強制同步點來破壞GPU / CPU並行性,並且會在CPU和GPU上創建許多空閑的氣泡。

CPU僅可訪問臨時池,因此是的,來回的臨時資源是必需的。

為了提高性能,您應該考慮:

  1. 使您的技術僅適用於GPU
  2. 如果是回讀的唯一方法,請限制在臟的或必要的部分
  3. 嘗試在整個框架上使用幾個紋理,以使CPU在后面幾幀的版本上工作以保護並行性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM