2010-10-12 64 views
3

所以,我在窗口應用程序中使用D3D。如何在D3D窗口應用中啓用VSYNC?

我inited D3D使用以下參數:

windowed: true; 
backbufferformat: D3DFMT_X8R8G8B8; 
presentinterval: D3DPRESENT_INTERVAL_ONE; 
swapeffect: DISCARD 

每次OnPaint中被調用時,我呈現圖像後備緩衝區並將其呈現給前面。

據我所知(MSDN也這樣說),一旦我設置了D3DPRESENT_INTERVAL_ONE,vsync就可以工作。

但是在這種情況下,水平拖動時圖像被撕裂。

(似乎有在圖像的線,該線下方的圖像顯示在監視器上和上述部分如下)。

有些網站說D3DPRESENT_INTERVAL_ONE不會在窗口的應用程序。

我該如何啓用vsync?

p.s.我終於發現D3D vsync已啓用,但某些窗口設置不正確,可能窗口本身未同步。儘管如此,我還沒有看清楚設置。

+0

你有沒有試過swapeffect:FLIP? – Goz 2010-10-13 08:02:07

+0

我試着按照你的建議,但它沒有工作.. – 2010-10-13 09:15:01

+0

TBH我的理解總是說你不能VSync窗口渲染器。也許我錯了,但有了這個假設,我從來沒有失望;) – Goz 2010-10-17 19:11:26

回答

0

你不能在窗口中同步,只能在全屏模式下。但是,您可能會通過從默認顯示獲取信息並找到刷新率,然後削弱您的渲染器以僅渲染該速率來疏忽它,儘管我不會建議該路線。

0

對於d3d而言,歷史上的窗口已經無法被驗證,並且直到最近纔有可能,當在WinVista或Win7中啓用aero並且該應用程序未在演示模式下運行時。

0

不完全是D3D,但是AntiTearing.html描述了MPC-HC如何使用窗口化的EVR等嘗試和避免撕開窗口顯示器。這裏的鏈接:http://betterlogic.com/roger/2012/05/gdi-vsync-to-avoid-tearing/也可能對同步很有用(儘管是一種解決方法)。

+0

MPC-HC的鏈接被破壞,這是最後一個存檔:https://web.archive.org/web/20120505154244/http://mpc-hc.sourceforge.net/AntiTearing.html 順便說一句,我沒有看到有任何描述提到。 – tsul 2017-01-31 16:38:09

0

你多久打一次電話:: OnPaint?我問的原因是,您必須更多地調用:: OnPaint,而不是連接的顯示器的刷新率。

對於我來說,只要消息循環處於空閒狀態並使窗口無效,我就通過強制執行一個:: OnPaint來解決刷新問題。如果你這樣做,會發生什麼事情,即D3D的RenderPresent命令將等待,直到顯卡完成渲染,這會給你一個非常精確的時間:: OnPaint與實際顯示器刷新率同步!

我在這方面取得了很好的成功,並且上面那個窗口模式的語句不能vsync是絕對不正確的。即使在DirectX 9 Win XP中,這也行得通。

哦,最後但並非最不重要的一點,如果您連接了多個顯示器,請確保與顯示窗口的實際顯示器同步。這似乎有點棘手。

3

我假設你使用的是D3D9?應該添加該標籤。在您D3DPRESENT_PARAMS變量:

如果你這樣做,你正在使用的舊GDI的東西,這不是你的VSYNC設置這是錯誤的,但窗口的設置。你必須啓用雙緩衝,否則你仍然會撕裂。

相關問題