2016-01-04 14 views
10

Tôi không rõ ràng từ Đặc điểm kỹ thuật OpenGL trên Sync objects, cho dù sử dụng glGetSynciv hoặc glClientWaitSync trong trường hợp tôi muốn kiểm tra tín hiệu của đối tượng đồng bộ hóa mà không phải đợi. Làm thế nào để hai lệnh sau đây so sánh về hành vi và hiệu suất:Để sử dụng cho phía khách hàng OpenGL chờ đợi: glGetSynciv vs glClientWaitSync?

GLint syncStatus; 
glGetSynciv(*sync, GL_SYNC_STATUS, sizeof(GLint), NULL, &syncStatus); 
bool finished = syncStatus == GL_SIGNALED; 

vs

bool finished = glClientWaitSync(*sync, 0 /*flags*/, 0 /*timeout*/) == ALREADY_SIGNALED; 

Một số chi tiết cho các câu hỏi:

  • Liệu glGetSynciv thực hiện một khứ hồi đến máy chủ GL ?
  • Có phương pháp nào được ưu tiên về hỗ trợ/lỗi của trình điều khiển không?
  • Có thể là phương thức bế tắc hoặc không trả lại ngay lập tức không?

Một số bối cảnh:

  • này là dành cho một máy nghe nhạc video, mà đang trình chiếu hình ảnh từ một nguồn vật chất để GPU để render.
  • Một chuỗi đang tải lên/liên tục tải lên họa tiết và một chuỗi khác hiển thị chúng sau khi tải lên xong. Mỗi khung kết xuất, chúng tôi đang kiểm tra xem kết cấu tiếp theo đã hoàn tất tải lên chưa. Nếu nó có, sau đó chúng tôi bắt đầu vẽ kết cấu mới này, nếu không tiếp tục sử dụng kết cấu cũ.
  • Quyết định chỉ ở phía khách hàng và tôi không muốn chờ chút nào, nhưng nhanh chóng tiếp tục hiển thị kết cấu chính xác.

Cả hai phương pháp đều có ví dụ về những người sử dụng chúng với mục đích không chờ đợi, nhưng không có cách nào để thảo luận về giá trị của việc sử dụng cái này hay cách khác.

+0

Thú vị, mặc dù tôi nghi ngờ sẽ có nhiều sự khác biệt giữa hai tập quán. –

+0

Một thử nghiệm đầu tiên dường như chỉ ra rằng glGetSynciv mất 0,01 ms, glClientWaitSync 0,001 ms (trên NVIDIA, YMMV). –

+0

Bạn nhận được loại giải pháp như thế nào? –

Trả lời

1

Trích dẫn Sách Đỏ,

trống glGetSynciv (sync GLsync, GLenum pname, GLsizei bufSize, GLsizei * chiều dài, tia sáng lóe lên * giá trị);

Truy xuất thuộc tính của đối tượng đồng bộ hóa. đồng bộ hóa chỉ định một điều khiển cho đối tượng đồng bộ để đọc thuộc tính được chỉ định bởi pname. bufSize là kích thước tính bằng byte của bộ đệm có địa chỉ được cung cấp trong giá trị. chiều dài là địa chỉ của một biến số nguyên sẽ nhận được số byte ghi vào giá trị

Trong khi cho glClientWaitSync:

GLenum glClientWaitSync (GLsync sync, GLbitfields cờ, GLuint64 timeout) ;

Làm cho khách hàng chờ đối tượng đồng bộ để được báo hiệu. glClientWaitSync() sẽ đợi tối đa timeout nano giây để đối tượng trở thành tín hiệu trước khi tạo thời gian chờ. Các tham số cờ có thể được sử dụng để kiểm soát hành vi xả nước của lệnh. Chỉ định GL_SYNC_FLUSH_COMMANDS_BIT tương đương với việc gọi glFlush() trước khi thực hiện chờ.

Vì vậy, về cơ bản glGetSynciv() được sử dụng để biết nếu đối tượng hàng rào đã trở thành dấu hiệu và glClientWaitSync() được sử dụng để chờ cho đến khi đối tượng hàng rào đã trở thành hiệu.

Nếu bạn chỉ muốn biết một vật thể hàng rào có được báo hiệu hay không, tôi khuyên bạn nên sử dụng glGetSynciv(). Rõ ràng là glClientWaitSync()nên mất nhiều thời gian để thực thi sau đó glGetSynciv(), nhưng tôi đoán vậy. Hy vọng tôi đã giúp bạn.

+1

Điều quan trọng là làm thế nào glClientSyncWait với thời gian chờ 0 so sánh với glGetSynciv(). Các thử nghiệm của tôi dường như chỉ ra rằng nó là glClientWaitSync nhanh hơn trên NVIDIA. Điều này làm tôi tò mò nếu glGetSynciv() có nhiều hạn chế hơn. –

+0

Vâng, tôi thấy điều thú vị là chức năng nên "chờ" trong thực tế chạy nhanh hơn sau đó chỉ nên truy xuất trạng thái của OpenGL. – Matth

+1

@MatthUnderpants Nó sẽ không chờ đợi nếu một thời gian chờ của 0 được chỉ định. Đó là điểm của câu hỏi. –

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