2016-08-02 23 views
7

Người ta có thể đánh giá các hàm JavaScript thông thường bằng cách đếm số lần anh ta có thể gọi các hàm đó trong một giây. Tuy nhiên, trên WebGL, các chức năng như gl.drawArrays không đồng bộ, do đó bạn không thể đo thời gian mà trình đổ bóng thực hiện bằng cách đo điểm chuẩn cuộc gọi API.Tôi làm cách nào để đánh dấu trình đổ bóng WebGL?

Có cách nào để đánh giá các chức năng WebGL không?

Trả lời

3

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

2

Không có cách nào để có được thời gian thực hiện đổ bóng chính xác mà không có thể một số GPU cụ nhà cung cấp cụ thể. Tuy nhiên, ngoài đề xuất của gman, bạn còn có thể mở rộng thời gian thực hiện cuộc gọi vẽ, điều này phụ thuộc vào thời gian thực hiện của trình đổ bóng, đặc biệt khi các trình tạo bóng của bạn khá nặng (do đó chiếm phần lớn thời gian GPU thực hiện của bạn) vẽ cuộc gọi).

+0

'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

+0

@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 đó. –

+0

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

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