Tôi có một ứng dụng thử nghiệm OpenGL đơn giản trong C, rút ra những điều khác nhau để đáp ứng với đầu vào chính. (Mesa 8.0.4, đã thử với Mesa-EGL và với GLFW, Ubuntu 12.04LTS trên PC với NVIDIA GTX650). Việc vẽ khá đơn giản / nhanh chóng (loại hình tam giác xoay). Mã kiểm tra của tôi không giới hạn tốc độ khung hình một cách có chủ ý theo bất kỳ cách nào, nó chỉ trông như thế này:
while (true)
{
draw();
swap_buffers();
}
Tôi đã tính thời gian này rất cẩn thận và tôi thấy rằng thời gian từ một cuộc gọi eglSwapBuffers()
(hoặc glfwSwapBuffers
, điều tương tự) đến cuộc gọi tiếp theo là ~ 16,6 mili giây. Thời gian từ sau cuộc gọi đến eglSwapBuffers()
ngay trước cuộc gọi tiếp theo chỉ ít hơn thế một chút, mặc dù những gì được rút ra rất đơn giản. Thời gian mà bộ đệm trao đổi cuộc gọi mất dưới 1ms.
Tuy nhiên, thời gian từ ứng dụng thay đổi những gì nó vẽ để phản hồi với phím bấm đến thay đổi thực sự hiển thị trên màn hình là> 150ms (giá trị khoảng 8-9 khung hình). Điều này được đo bằng camera ghi lại màn hình và bàn phím ở tốc độ 60fps.
Do đó, các câu hỏi:
Trường hợp rút thăm được đệm giữa một lệnh gọi để trao đổi bộ đệm và thực sự hiển thị trên màn hình? Tại sao lại có sự chậm trễ? Có vẻ như ứng dụng đang vẽ nhiều khung hình phía trước màn hình mọi lúc.
Ứng dụng OpenGL có thể làm gì để thu hút màn hình ngay lập tức? (tức là: không có bộ đệm, chỉ chặn cho đến khi vẽ xong; tôi không cần thông lượng cao, tôi cần độ trễ thấp)
Ứng dụng có thể làm gì để rút thăm ngay lập tức ở trên nhanh nhất có thể?
Làm thế nào một ứng dụng có thể biết những gì thực sự trên màn hình ngay bây giờ? (Hoặc, độ trễ của bộ đệm hiện tại là bao lâu / bao nhiêu khung hình?)