Rất khó để đánh giá trình đổ bóng bởi vì có rất nhiều ngữ cảnh và chúng rất cụ thể về GPU.
Bạn có thể biết liệu một bóng đổ có nhanh hơn cách khác bằng cách sử dụng performance.now
trước và sau khi vẽ một loạt nội dung với trình đổ bóng đó (vài nghìn đến triệu cuộc gọi vẽ) rồi ngừng GPU bằng cách gọi gl.readPixels
. Nó sẽ cho bạn biết đó là nhanh hơn. Nó sẽ không cho bạn biết họ nhanh như thế nào kể từ khi ngừng GPU bao gồm thời gian bắt đầu và trì hoãn.
Hãy suy nghĩ về một chiếc xe đua. Đối với một dragster bạn tăng tốc thời gian để dest. Đối với một chiếc xe đua bạn thời gian một vòng đi tốc độ đầy đủ. Bạn để cho chiếc xe đi một vòng đầu tiên trước khi thời gian, bạn thời gian vòng 2, chiếc xe vượt qua đường bắt đầu đi tốc độ đầy đủ và dòng kết thúc cũng đi tốc độ đầy đủ. Vì vậy, bạn sẽ có được tốc độ của chiếc xe mà đối với các dragster bạn nhận được tăng tốc của nó (không liên quan đến GPU nói chung kể từ khi bạn đang đi cho tốc độ bạn không bao giờ nên bắt đầu và ngăn chặn chúng).
Cách khác mà không cần thêm thời gian bắt đầu/dừng là vẽ một bó giữa các khung hình requestAnimationFrame
. Tiếp tục tăng số lượng cho đến khi thời gian giữa các khung hình nhảy lên toàn bộ khung hình. Sau đó so sánh số lượng giữa các trình đổ bóng.
Có các vấn đề khác trong quá trình sử dụng thực tế. Ví dụ như một GPU lát gạch (như PowerVR trên nhiều thiết bị di động) cố gắng để loại bỏ các phần của nguyên thủy sẽ bị quá tải. Vì vậy, một shader nặng với rất nhiều overdraw trên một GPU không lát gạch có thể được rất nhiều nhanh chóng trên một GPU lát gạch.
Cũng đảm bảo bạn đang định thời gian phù hợp. Nếu bạn định thời gian đổ bóng đỉnh, bạn có thể muốn làm cho canvas 1x1 pixel và bạn đổ bóng đổ mảnh càng đơn giản càng tốt và vượt qua rất nhiều đỉnh trong một cuộc gọi vẽ (để xóa thời gian gọi). Nếu bạn đang định thời gian đổ bóng phân đoạn thì có thể bạn muốn một canvas lớn và một tập hợp các đỉnh có chứa một số khung hình canvas đầy đủ.
Xem thêm WebGL/OpenGL: comparing the performance
'EXT_disjoint_timer_query' sẽ không cung cấp cho bạn thông tin hữu ích về kiến trúc lát gạch như PowerVR (iOS) vì họ sử dụng trình kết xuất bị trì hoãn mà tốt nhất họ có thể làm là cung cấp cho bạn thời gian cho toàn bộ khung sau khi tất cả các đa giác đã được chia nhỏ trong gạch, tắc cắt, gạch tất cả được hiển thị, v.v. https://imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ – gman
@gman Có. Tuy nhiên, chúng ta đang nói về ** shader ** benchmarking. Các tình huống này là cơ hội để làm cho cuộc sống khó chịu đối với TBDR và do đó có được kết quả khá phù hợp. Tôi có sai ở đây không? Chưa bao giờ thử nghiệm giả định đó. –
Nhưng bạn có thể? Tôi đoán miễn là bạn bật pha trộn, bạn có thể ít nhất có được một số ý tưởng về nếu một bóng là nhanh hơn khác. Với việc hòa trộn tất cả các khoản tiền rút của bạn sẽ bị hủy. Bạn chỉ cần nhớ thời gian bạn nhận được trở lại bao gồm tất cả các phân chia đa giác, gạch bucketing, vv do đó, nó không chỉ là thời gian của shader của bạn.Tôi đoán rằng cũng giả định phần mở rộng thậm chí tồn tại trên kiến trúc lát gạch và những gì nó thực sự trả về. – gman