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.
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. –
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). –
Bạn nhận được loại giải pháp như thế nào? –