Tôi đang cố gắng thực hiện kết xuất được đồng bộ hóa theo chiều dọc sao cho chính xác một kết xuất được thực hiện trên mỗi lần đồng bộ hóa dọc, không bỏ qua hoặc lặp lại bất kỳ khung nào. Tôi sẽ cần điều này để làm việc trong Windows 7 và (trong tương lai) Windows 8.Cách thực hiện chính xác một lần hiển thị trên mỗi đồng bộ hóa dọc (không lặp lại, không bỏ qua)?
Về cơ bản nó sẽ vẽ một chuỗi QUADS
phù hợp với màn hình sao cho pixel từ hình ảnh gốc khớp với 1: 1 a pixel trên màn hình. Phần hiển thị không phải là vấn đề, với OpenGL hoặc DirectX. Vấn đề là việc đồng bộ hóa chính xác.
tôi trước đây đã cố gắng sử dụng OpenGL, với phần mở rộng WGL_EXT_swap_control
, bằng cách vẽ và sau đó gọi
SwapBuffers(g_hDC);
glFinish();
Tôi đã thử tất cả kết hợp và hoán vị của hai hướng dẫn những cùng với glFlush(), và nó là không đáng tin cậy.
sau đó tôi thử với Direct3D 10, bằng cách vẽ và sau đó gọi
g_pSwapChain->Present(1, 0);
pOutput->WaitForVBlank();
nơi g_pSwapChain
là một IDXGISwapChain*
và pOutput
là IDXGIOutput*
liên quan đến SwapChain đó.
Cả hai phiên bản, OpenGL và Direct3D, kết quả giống nhau: Chuỗi đầu tiên, có 60 khung hình, không kéo dài những gì cần (thay vì khoảng 1000ms ở 60Hz, kéo dài khoảng 1030 hoặc 1050ms), những cái sau đây dường như hoạt động tốt (khoảng 1000,40ms), nhưng bây giờ mọi thứ dường như bỏ qua một khung. Tôi thực hiện phép đo với QueryPerformanceCounter
.
Trên Direct3D, thử một vòng lặp chỉ là WaitForVBlank, thời lượng 1000 lần lặp lại luôn là 1000,40 với ít biến thể.
Vì vậy, sự cố ở đây không biết chính xác khi nào mỗi hàm được gọi là trả về và liệu hoán đổi có được thực hiện trong quá trình đồng bộ hóa dọc hay không (không phải trước đó, để tránh xé).
Lý tưởng (nếu tôi không nhầm), để đạt được thứ tôi muốn, sẽ thực hiện một lần hiển thị, đợi cho đến khi quá trình đồng bộ bắt đầu, hoán đổi trong quá trình đồng bộ, sau đó đợi cho đến khi quá trình đồng bộ hoàn tất. Làm thế nào để làm điều đó với OpenGL hoặc DirectX?
Chỉnh sửa: Vòng lặp kiểm tra chỉ WaitForVSync
60x mất liên tục từ 1000.30ms đến 1000.50ms. Vòng lặp tương tự với Present(1,0)
trước WaitForVSync
, không có gì khác, không hiển thị, mất cùng một lúc, nhưng đôi khi không thành công và mất 1017ms, như thể đã lặp lại một khung. Không có kết xuất, vì vậy có gì đó sai ở đây.
Điều đó cũng có sẵn trong DX10 không? Tôi đang tạo thiết bị với 'D3D10CreateDeviceAndSwapChain', mà theo như tôi có thể nói không có bất kỳ Tham số hiện tại nào. – slazaro
Tôi sợ DX10 không có tùy chọn này. Xin lỗi, tôi không nhiều vào DX10. – miloszmaki
Thực ra bạn cũng muốn đặt nó: D3DPRESENT_INTERVAL_ONE ... và D3D10 thực hiện vsync thông qua phương thức hiện tại 'swapChain-> Present (vSync, 0);' – zezba9000