Próbuję wykonać rendery synchronizowane w pionie, aby dokładnie jeden render był wykonywany na synchronizację w pionie, bez pomijania ani powtarzania żadnych ramek. Potrzebuję tego do pracy pod Windows 7 i (w przyszłości) Windows 8.Jak wykonać dokładnie jeden render na synchronizację w pionie (bez powtarzania, bez pomijania)?
Będzie to zasadniczo polegać na rysowaniu sekwencji QUADS
, która pasowałaby do ekranu, tak aby piksel z oryginalnych zdjęć pasował do 1: 1 a piksel na ekranie. Część renderująca nie stanowi problemu, ani z OpenGL, ani z DirectX. Problem polega na prawidłowej synchronizacji.
ja wcześniej wypróbowane przy użyciu OpenGL, z rozszerzeniem WGL_EXT_swap_control
, rysując, a następnie wywołanie
SwapBuffers(g_hDC);
glFinish();
Próbowałem wszystkich kombinacji i permutacji tych dwóch instrukcji wraz z glFlush(), i nie było wiarygodne.
Następnie próbowałem z Direct3D 10, rysując, a następnie wywołanie
g_pSwapChain->Present(1, 0);
pOutput->WaitForVBlank();
gdzie g_pSwapChain
jest IDXGISwapChain*
i pOutput
jest IDXGIOutput*
związane z tym SwapChain.
Obie wersje, OpenGL i Direct3D, dają takie same wyniki: Pierwsza sekwencja, powiedzmy 60 klatek, nie trwa tak, jak powinna (zamiast około 1000 ms przy 60 Hz trwa około 1030 lub 1050 ms), następujące wydają się działać dobrze (około 1000.40ms), ale od czasu do czasu zdaje się pomijać klatkę. Wykonuję pomiar za pomocą QueryPerformanceCounter
.
W Direct3D, próbując pętli tylko WaitForVBlank, czas trwania 1000 iteracji jest zawsze 1000.40 z niewielką zmianą.
Problem polega więc na tym, że nie wiadomo dokładnie, kiedy każda z funkcji zwanych zwraca i czy zamiana jest wykonywana podczas synchronizacji pionowej (nie wcześniej, aby uniknąć łzawienia).
Idealnie (jeśli się nie mylę), aby osiągnąć to, co chcę, byłoby wykonać jeden render, poczekać, aż zacznie sync, swap podczas synchronizacji, a następnie poczekać, aż synchronizacja jest wykonywana. Jak to zrobić z OpenGL lub DirectX?
Edit: Pętla test tylko WaitForVSync
60x trwa niezmiennie od 1000.30ms do 1000.50ms. Ta sama pętla z Present(1,0)
przed WaitForVSync
, bez niczego innego, bez renderowania, zajmuje ten sam czas, ale czasami kończy się niepowodzeniem i zajmuje 1017 ms, jak gdyby po powtórzeniu ramki. Nie ma renderingu, więc coś jest nie tak.
Czy jest to również dostępne w DX10? Tworzę urządzenie z 'D3D10CreateDeviceAndSwapChain', które, o ile mogę powiedzieć, nie ma żadnych Present Presenters. – slazaro
Obawiam się, że DX10 nie ma tej opcji. Przepraszam, nie jestem zbytnio w DX10. – miloszmaki
Właściwie chcesz to również ustawić: D3DPRESENT_INTERVAL_ONE ... i D3D10 wykonuje operację vsync poprzez swoją obecną metodę 'swapChain-> Present (vSync, 0);' – zezba9000