2013-06-17 11 views
7

Hiện tại tôi có khoảng 15 lần hiển thị đường dẫn trong đường dẫn của mình. Đối với mỗi vượt qua, tôi thiết lập các cài đặt chính xác trước khi vẽ và đặt lại chúng sau đó. Các cài đặt đó bao gồm kích thước khung nhìn, kiểm tra độ sâu hoặc tắt, chức năng hòa trộn hoặc tắt, chức năng stencil, thao tác stencil và hơn thế nữa.OpenGL có ngăn các cuộc gọi API không cần thiết không?

Tôi tự hỏi liệu OpenGL có đủ thông minh để bỏ qua các cuộc gọi API có đặt trạng thái đã có sẵn hay không. Bởi vì nếu không tôi sẽ theo dõi trạng thái với rất nhiều cờ và trước khi biểu diễn trả lại chỉ đặt trạng thái nếu nó thực sự cần thiết.

+0

Tôi đã hỏi một câu hỏi 'tương tự' về đồng phục cho GLSL: http://stackoverflow.com/questions/14724324/is-it-worth-caching-glsl-uniform-location-in-code. Câu trả lời cũng là "nó phụ thuộc vào người lái xe" :) – fen

Trả lời

7

Câu trả lời ngắn: Tùy thuộc vào trình điều khiển.

Bản thân OpenGL không làm được gì nhiều. Nó là để các nhà cung cấp để thực hiện các chức năng theo quy định của tiêu chuẩn bất kỳ cách nào họ thấy phù hợp. Họ có thường xuyên kiểm tra trạng thái hiện tại để tránh không cần thiết trì hoãn đường ống không? Có lẽ, nhưng không được đọc lời khuyên từ các nhà cung cấp hoặc tự đo lường hiệu suất, không có cách nào để biết chắc chắn.

Sự đồng thuận của lời khuyên tôi đã thấy (không có tham chiếu cho điều này vì nó được lan truyền khắp nơi), là bạn nên tránh gọi OpenGL với các thay đổi trạng thái dư thừa. Nó không thể làm hại nhiều và nó có thể làm tốt.

Trong trường hợp của bạn (thay đổi trạng thái vài lần trên mỗi khung giữa các đường chuyền), có thể nó sẽ không tạo ra nhiều khác biệt.

+2

Câu trả lời thậm chí ngắn hơn là: Không. Khi người lái kéo lệnh từ hàng đợi của nó và do đó có cơ hội bỏ qua các cuộc gọi trùng lặp, _ bạn đã thực hiện_ cuộc gọi API. Ngoài ra, truy vấn nhà nước thường liên quan đến việc trì hoãn các đường ống, đó là đắt hơn nhiều so với thiết lập nó dư thừa. – Damon

+1

@Damon. Trình điều khiển không phải truy vấn trạng thái, nó có thể được lưu trữ trong một biến dễ dàng.Ngoài ra khi chúng tôi giả định các nhà phát triển trình điều khiển hoặc thực hiện các xét nghiệm này hoặc họ không có ý nghĩa, sau đó trong cả hai trường hợp nó không có ý nghĩa đối với tôi để thực hiện nó bản thân mình. – danijar

+1

@danijar: Chỉ có 2 thay đổi trạng thái trong đồ họa thực sự làm giảm hiệu suất: Công tắc kết cấu và công tắc đổ bóng. Người ta thường sắp xếp theo kết cấu và đổ bóng trước khi dựng hình, vì lý do đó. – datenwolf

-1

rất nhiều trong số này có vẻ là cờ và có thể sẽ đắt hơn để đặt cờ hơn là thử nghiệm và đặt cờ. vì vậy câu hỏi đặt ra là liệu OpenGL có đủ ngu ngốc để làm điều đó hơn là đủ thông minh hay không.

cho phần còn lại tôi nghi ngờ nếu chi phí tính toán, có lẽ thiết lập ma trận chuyển đổi sẽ có ý nghĩa so với công việc dựng hình thực tế và không đáng tối ưu hóa ở cấp thư viện.

+0

Đừng đưa ra những giả định như vậy. Trên nhiều kiến ​​trúc bộ nhớ được lưu trong bộ nhớ đệm, các ghi vô điều kiện phải được sao chép tất cả theo cách ngược lại, nhưng đọc/so sánh/điều kiện-ghi có thể tránh được việc viết lại tốn kém đó. – MSalters

2

Vì nếu không tôi sẽ theo dõi trạng thái với nhiều cờ và trước khi trả lại chỉ đặt trạng thái nếu thực tế là cần thiết.

Xin lưu ý rằng điều này có thể hoặc có thể không nhanh hơn khi rời khỏi trạng thái hiện tại. OpenGL là, như những người khác nói, chỉ có một đặc điểm kỹ thuật API, để lại việc thực hiện cho các nhà cung cấp GPU (hoặc các cộng đồng nguồn mở như Mesa). Nói chung, bạn nên mong đợi mọi cuộc gọi để tạo ra một số kết quả, nhưng nếu mối quan tâm chính của bạn là hiệu suất, cách duy nhất để thực sự chọn là lược tả.

Những kết quả này có thể thay đổi từ nền tảng này sang nền tảng khác hoặc thậm chí là phiên bản trình điều khiển đồ họa và đôi khi những thứ không ngờ như chạy từ nguồn pin. Cho đến khi bạn đo lường, bạn không thể nói vấn đề hiệu suất thực sự trong ứng dụng của bạn là gì.