2012-07-19 47 views
2

我使用direct3d來呈現yuv視頻數據。基本的過程是:lockflags在direct3d中做些什麼

使用CreateOffscreenPlain創建一個yv12曲面 在這個曲面上的lockrectangle獲取數據指針,將yuv數據拷貝到它。 從此表面拉伸矩形到後臺緩衝區 調用存在以顯示後臺緩衝區。

在LockRectangle調用上有一個LockFlags參數,我們一直在使用LockFlags.Discard,這聽起來像是意味着我們會覆蓋整個緩衝區。

這似乎在某些intel板載圖形設備上導致了一些問題(例外情況),而如果我將LockFlags更改爲LockFlags.None,問題似乎消失。我是否通過這樣做創造了競賽條件?

我想我可能需要了解這裏的鎖的必要性。顯示在32位rgb中,所以我猜測yuv到rgb的轉換是在stretchrectangle調用中完成的。這個過程是否假設爲同步或異步?我想我已經讀過,這個禮物是異步的,但這對我來說並不重要,因爲這是對後緩衝器的操作,我不直接觸摸。

道歉如果問題沒有意義,我不認爲我已經得到了很好的處理。

回答

0

我想用你的D3D9?無論哪種方式在所有的API上都是一樣的。

當使用「D3DLOCK_DISCARD」時,應該總是重寫緩衝區中的所有數據。聽起來你可能不是?

如果您的意圖是重寫緩衝區中的所有數據,則出於性能原因,您確實希望使用「丟棄」。如果你只寫了一部分數據,你可以使用'none'。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb147263(v=vs.85).aspx 「如果圖形處理器仍使用緩衝器時鎖定被調用D3DLOCK_DISCARD,一個指針到新的存儲區域被返回,而不是舊緩衝器中的數據」。

+0

是的,我在D3D9上。我正在重寫整個緩衝區,事實上DSDLOCK_DISCARD似乎在大多數系統上的性能稍微好一些,但我無法弄清楚爲什麼這個標誌會在某些帶有intel板載圖形的系統上導致異常。我不得不使用LockFlags.None來兼容性和生活的表現,再加上我討厭修復那裏,我不完全理解。 – 2012-09-20 18:08:07

+0

如果你不需要Windows XP的支持,你可以移動到D3D11 ...更清潔的API,並運行在Windows Vista到Windows 8. D3D11支持direct3d9視頻卡。 – zezba9000 2012-09-22 06:35:18