Vì các thẻ ngày hôm nay dường như giữ một danh sách các lệnh hiển thị và chỉ xả trên một cuộc gọi đến glFlush
hoặc glFinish
, có phải là bộ đệm đôi thực sự cần thiết nữa không? Một trò chơi OpenGL tôi đang phát triển trên Linux (thẻ ATI Mobility radeon) với SDL/OpenGL thực sự nhấp nháy ít hơn khi SDL_GL_swapbuffers()
được thay thế bằng glFinish()
và với SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0)
trong mã init. Đây có phải là trường hợp cụ thể của thẻ của tôi hay là những thứ như vậy trên tất cả các thẻ?Bộ đệm đôi có cần thêm bất kỳ
EDIT: Tôi đã phát hiện ra nguyên nhân của việc này là KWin. Có vẻ như datenwolf đã nói, sự kết hợp không đồng bộ là nguyên nhân. Khi tôi tắt phối hợp KWin, trò chơi hoạt động tốt mà không BẤT K AN các bản vá mã nguồn
Bài đăng được đề cập trên 6 tuổi. Liệu X11 vẫn thiếu một kế hoạch đồng bộ? Còn Windows thì sao? –
Ngoài lời giải thích của datenwolf, bạn nên lưu ý rằng bạn thường sẽ _never_ muốn gọi 'glFlush' hoặc' glFinish', ngoại trừ có thể trong một số trường hợp đặc biệt rất rất hiếm. 'glFinish' không làm gì' (wgl | glx) SwapBuffers' đã không làm (giả sử rằng vsync được kích hoạt), và 'glFlush' chỉ xóa các lệnh được xếp hàng đợi và báo hiệu máy chủ bắt đầu xử lý chúng, không làm gì tốt nhất trường hợp (nhưng là một cuộc gọi vô dụng và bối cảnh chuyển đổi), và kết quả trong hiệu suất tồi tệ hơn trong trường hợp xấu nhất (vì sub-tối ưu hóa lập kế hoạch tài nguyên GPU). – Damon
Lý tưởng nhất, bạn sẽ muốn ném càng nhiều lệnh tại GL càng tốt, với các phụ thuộc lan truyền xa như bạn có thể (ví dụ: nếu bạn sử dụng kết cấu, trước tiên hãy gửi lệnh để xác định hình ảnh kết cấu, đặt trạng thái kết cấu, v.v. sau đó gửi một số lệnh làm điều gì đó khác, và chỉ sau đó vẽ một cái gì đó sử dụng kết cấu này).Điều này đảm bảo rằng a) các lệnh trong dòng lệnh của bạn ít có khả năng chặn vì phụ thuộc và b) trình điều khiển có thể lên lịch một số lệnh khác để sử dụng GPU (OpenCL hoặc chương trình khác?) Nếu các lệnh trong hàng đợi của bạn sẽ bị ngừng. – Damon