2011-07-01 24 views
14

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

Trả lời

19

Đệm đôi và glFinish là hai điều rất khác nhau.

glFinish chặn chương trình, cho đến khi mọi thao tác vẽ hoàn tất.

Đệm đôi được sử dụng để ẩn quá trình hiển thị từ người dùng. Nếu không có bộ đệm đôi, mỗi thao tác vẽ đơn sẽ hiển thị ngay lập tức, giả sử tần suất làm mới hiển thị là vô cùng cao. Trong thực tế, bạn sẽ nhận được một số đồ tạo tác hiển thị, giống như các phần của cảnh hiển thị trong một trạng thái, phần còn lại không hiển thị hoặc ở trạng thái khác, ảnh có thể không hoàn chỉnh, v.v. Đệm đôi tránh điều này bằng cách hiển thị đầu tiên vào bộ đệm sau và chỉ sau khi rendering đã được hoàn thành trao đổi này trở lại với bộ đệm phía trước, mà được gửi đến các thiết bị hiển thị.

Giờ đây, việc quản lý cửa sổ ngày nay trở nên phổ biến: Windows có Aero, MacOS X Quartz Extreme và trên Linux ít nhất là Unity và GNOME3 shell compositing nếu có. Vấn đề là: Compositing kỹ thuật tạo ra doublebuffering: Windows vẽ ra bộ đệm offscreen và của những màn hình cuối cùng được tổng hợp. Vì vậy, nếu bạn đang chạy trên một máy tính kết hợp, sau đó đệm đôi là loại dự phòng nếu được thực hiện trong chương trình của bạn, và tất cả những gì nó cần là một loại cơ chế đồng bộ hóa, để cho bộ tổng hợp biết khi khung tiếp theo sẵn sàng. MacOS X có cái này. X11 vẫn thiếu một lược đồ đồng bộ hóa thích hợp, xem bài đăng này trên maillist: http://lists.freedesktop.org/archives/xorg/2004-May/000607.html

TL; DR: Đệm đôi và glFinish là những thứ khác nhau và bạn cần đệm đôi (một số loại) để mọi thứ trông đẹp mắt.

+0

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? –

+3

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

+1

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

2

Tôi hy vọng rằng nó sẽ làm được nhiều hơn với những gì bạn đang vẽ hoặc phần cứng của bạn hơn bất kỳ thứ gì có thể được khái quát hóa. . Vì vậy không: đừng cố gắng làm điều này.

Ồ, đừng quên multisampling. Nhiều triển khai chỉ đa mẫu đệm sau; bộ đệm trước không được ghép nhiều lần. Việc hoán đổi sẽ giảm bớt mẫu từ bộ đệm đa chiều.

Các vấn đề liên quan