2013-03-02 27 views
5

Vì vậy, khi bạn gọi các hàm opengl, như glDraw hoặc gLBufferData, nó có làm cho luồng của chương trình dừng lại và đợi GL kết thúc cuộc gọi không?Các chức năng của opengl có làm cho luồng chính bị đóng băng không?

Nếu không, thì GL xử lý các chức năng quan trọng như glDraw như thế nào, và sau đó ngay lập tức thay đổi cài đặt ảnh hưởng đến các cuộc gọi vẽ?

+0

Có thể nói chung họ sẽ chặn các chức năng, tôi không chắc chắn là tôi đã không thực hiện nó trước đây nhưng tôi cho rằng nó sẽ chạy trên vòng lặp và chỉ cập nhật khi cần để giữ tốc độ khung hình tăng lên. – PsyKzz

+0

@MattPsyK: Các chức năng OpenGL không giới thiệu điểm đồng bộ không chặn. – datenwolf

+0

Giả định xấu của tôi đã được thực hiện. – PsyKzz

Trả lời

6

Không, chúng (chủ yếu) không. Phần lớn các hàm GL được đệm khi được sử dụng và thực sự được thực thi sau này. Điều này có nghĩa là bạn không thể nghĩ về CPU và GPU là hai bộ xử lý hoạt động cùng một lúc. Thông thường, CPU thực hiện một loạt các hàm GL được đệm và, ngay sau khi chúng được phân phối tới GPU, điều này thực thi chúng. Điều này có nghĩa là bạn không thể kiểm soát đáng tin cậy thời gian cần cho một hàm GL cụ thể để thực thi bằng cách chỉ so sánh thời gian trước và sau khi thực thi.

Nếu bạn muốn thực hiện điều đó, trước tiên bạn cần chạy glFinish() để thực sự chờ tất cả các cuộc gọi GL được thực thi trước đó, và sau đó bạn có thể bắt đầu đếm, thực hiện các cuộc gọi mà bạn muốn đánh giá, gọi glFinish lần nữa để đảm bảo các cuộc gọi này được thực thi, và sau đó kết thúc điểm chuẩn.

Mặt khác, tôi đã nói "hầu hết". Điều này là do các chức năng đọc sẽ thực sự CẦN để đồng bộ hóa với GPU để hiển thị kết quả thực và do đó, trong trường hợp này, chúng đợi và đóng băng luồng chính.

chỉnh sửa: Tôi nghĩ bản giải thích sẽ trả lời câu hỏi bạn đã hỏi thứ hai, nhưng chỉ trong trường hợp: thực tế là tất cả các cuộc gọi đều được lưu vào bộ đệm để hoàn thành trước và sau đó thay đổi cài đặt sau đó cho các cuộc gọi liên tiếp

+0

vì vậy chức năng đọc có ngầm gọi glFinish() không? –

+0

@DanWebster: [\ * cough \ *] (http://www.opengl.org/wiki/Synchronization) –

1

Điều này phụ thuộc hoàn toàn vào cuộc gọi OpenGL đang được đề cập và trạng thái OpenGL. Khi bạn thực hiện cuộc gọi OpenGL, việc thực hiện đầu tiên xếp hàng chúng trong nội bộ và sau đó thực thi chúng một cách không đồng bộ với thực thi của chương trình gọi điện. Một khái niệm quan trọng của OpenGL là các điểm đồng bộ hóa. Đó là các hoạt động trong hàng đợi công việc yêu cầu cuộc gọi OpenGL chặn cho đến khi các điều kiện nhất định được đáp ứng.

Đối tượng OpenGL (kết cấu, đối tượng đệm, v.v.) hoàn toàn trừu tượng và bằng cách chỉ định xử lý của đối tượng trong chương trình khách luôn đến dữ liệu, đối tượng có thời gian gọi hàm OpenGL tham chiếu đến đối tượng này. Vì vậy, hãy lấy ví dụ về trình tự này:

glBindTexture(GL_TEXTURE_2D, texID); 

glTexImage2D(..., image_1); 
draw_textured_quad(); 

glTexImage2D(..., image_2); 
draw_textured_quad(); 

Đầu tiên draw_textured_quad có thể trở lại ngay cả trước khi bất kỳ nội dung nào được vẽ. Tuy nhiên bằng cách thực hiện các cuộc gọi OpenGL tạo ra một tham chiếu nội bộ cho dữ liệu hiện đang nắm giữ bởi kết cấu. Vì vậy, khi glTexImage2D được gọi là lần thứ hai, có thể xảy ra trước khi quad đầu tiên được rút ra, OpenGL phải tạo nội bộ đối tượng kết cấu phụ để trở thành kết cấu texID và được sử dụng bởi các cuộc gọi thứ hai là draw_textured_quad. Nếu glTexSubImage2D được gọi, nó thậm chí sẽ phải tạo một bản sao sửa đổi của nó.

Cuộc gọi OpenGL sẽ chỉ chặn, nếu kết quả của cuộc gọi sửa đổi bộ nhớ phía máy khách và phụ thuộc vào dữ liệu được tạo bởi các cuộc gọi OpenGL trước đó. Nói cách khác, khi thực hiện các cuộc gọi OpenGL, việc triển khai OpenGL tạo ra một cây phụ thuộc để theo dõi những gì phụ thuộc vào cái gì. Và khi một điểm đồng bộ hóa chặn nó sẽ ít nhất là chặn cho đến khi tất cả các phụ thuộc được đáp ứng.

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