我使用direct3d來呈現yuv視頻數據。基本的過程是:lockflags在direct3d中做些什麼
使用CreateOffscreenPlain創建一個yv12曲面 在這個曲面上的lockrectangle獲取數據指針,將yuv數據拷貝到它。 從此表面拉伸矩形到後臺緩衝區 調用存在以顯示後臺緩衝區。
在LockRectangle調用上有一個LockFlags參數,我們一直在使用LockFlags.Discard,這聽起來像是意味着我們會覆蓋整個緩衝區。
這似乎在某些intel板載圖形設備上導致了一些問題(例外情況),而如果我將LockFlags更改爲LockFlags.None,問題似乎消失。我是否通過這樣做創造了競賽條件?
我想我可能需要了解這裏的鎖的必要性。顯示在32位rgb中,所以我猜測yuv到rgb的轉換是在stretchrectangle調用中完成的。這個過程是否假設爲同步或異步?我想我已經讀過,這個禮物是異步的,但這對我來說並不重要,因爲這是對後緩衝器的操作,我不直接觸摸。
道歉如果問題沒有意義,我不認爲我已經得到了很好的處理。
是的,我在D3D9上。我正在重寫整個緩衝區,事實上DSDLOCK_DISCARD似乎在大多數系統上的性能稍微好一些,但我無法弄清楚爲什麼這個標誌會在某些帶有intel板載圖形的系統上導致異常。我不得不使用LockFlags.None來兼容性和生活的表現,再加上我討厭修復那裏,我不完全理解。 – 2012-09-20 18:08:07
如果你不需要Windows XP的支持,你可以移動到D3D11 ...更清潔的API,並運行在Windows Vista到Windows 8. D3D11支持direct3d9視頻卡。 – zezba9000 2012-09-22 06:35:18