2012-03-22 11 views
6

Tôi có một trang có hoạt động khá nặng (giữa trọng lượng thay vì) canvas đang diễn ra. Để phục vụ người dùng trên thiết bị di động và máy tính cũ, tôi nghĩ tôi có thể triển khai cơ chế sẽ kiểm tra xem phần tử canvas có thực sự hiển thị hay không và quyết định xem các tính toán liên tục và cập nhật canvas (hoạt ảnh chạy ở tốc độ 30 khung hình/giây) có phải được thực hiện hay không .Trình duyệt có hiển thị các phần tử canvas không nằm trong khung nhìn không?

Điều này có hiệu quả, nhưng khi thực hiện kiểm tra hiệu suất với Công cụ Chrome Dev, tôi nhận thấy rằng ngay cả khi tôi tắt kiểm tra khả năng hiển thị của mình và chỉ cho phép mọi thứ hiển thị hết thời gian sử dụng CPU của hàm được đề cập. khi không có phần nào của phần tử canvas (s) hiển thị (mặc dù trong lý thuyết nó vẫn phải thực hiện các tác vụ tương tự). Vì vậy: ít nhất là trên máy tính của tôi chạy Chrome 17, nó không tạo ra sự khác biệt thực sự nếu tôi kiểm tra khả năng hiển thị của phần tử.

Để cắt một câu chuyện dài: Tôi có cần phải làm điều này hoặc là trình duyệt đủ thông minh để xử lý một trường hợp như vậy mà không nói cho họ biết (và tôi có thể lưu kiểm tra hiển thị) không?


EDIT:

Vì vậy, tôi thực hiện một số "nghiên cứu" về chủ đề này và xây dựng this fiddle.

gì xảy ra là nó chỉ tạo ra tiếng ồn ở tốc độ 30 khung hình mỗi giây. Không quá hài lòng với mắt nhưng, ... Phần trên chỉ là một đồng bằng div để chặn chế độ xem. Khi tôi cuộn xuống và có phần tử canvas trong khung nhìn CPU Cách sử dụng cho tôi biết nó chiếm khoảng 40%, vì vậy dường như trình duyệt hiện có khá nhiều việc phải làm ở đây. Khi tôi cuộn lại lên để tôi chỉ có maroon màu div trong chế độ xem và hồ sơ của tôi, việc sử dụng CPU giảm xuống còn khoảng 10%. Khi tôi cuộn xuống dưới: mức sử dụng tăng trở lại.

Vì vậy, khi tôi thực hiện kiểm tra mức độ hiển thị như trong modified fiddle, tôi thấy sự gia tăng (nhỏ nhất thành thật) trong việc sử dụng CPU thay vì thả (vì nó có nhiệm vụ bổ sung kiểm tra xem canvas nằm trong khung nhìn). Vì vậy, tôi vẫn tự hỏi nếu đây là một số tác dụng phụ của một cái gì đó mà tôi không nhận thức được (hoặc tôi đang làm một số sai lầm lớn khi profiling) hoặc nếu tôi có thể mong đợi các trình duyệt đủ thông minh để xử lý các tình huống như vậy? Không, tôi không biết.

Nếu có ai có thể làm sáng tỏ điều đó, tôi sẽ rất biết ơn!

Trả lời

8

Tôi nghĩ bạn đang bối rối giữa việc logic có đang chạy hay không và hiển thị hiển thị hay không. Nhiều trình duyệt giờ đây đã tăng tốc phần cứng cho canvas của họ để tất cả hiển thị diễn ra trên GPU, do đó, việc đẩy pixel thực tế không mất thời gian CPU. Tuy nhiên, chức năng đánh dấu của bạn có mã không tầm thường để tạo ra nhiễu ngẫu nhiên trên CPU. Vì vậy, bạn chỉ thực sự quan tâm đến việc chức năng đánh dấu có đang chạy hay không.Nếu canvas là offscreen, chắc chắn nó sẽ không được hiển thị cho màn hình (nó không hiển thị). Đối với các cuộc gọi vẽ canvas, nó có thể phụ thuộc vào trình duyệt. Nó có thể làm cho tất cả các cuộc gọi vẽ thành canvas ngoài màn hình trong trường hợp bạn đột nhiên cuộn lại để xem hoặc nó chỉ có thể xếp hàng tất cả lệnh gọi vẽ và không thực sự làm bất cứ điều gì với chúng cho đến khi bạn cuộn khung để xem. Tôi không chắc chắn những gì mỗi trình duyệt hiện có.

Tuy nhiên, bạn không nên sử dụng setInterval hoặc setTimeout để làm hoạt hình canvas. Sử dụng API requestAnimationFrame mới. Trình duyệt không biết bạn làm gì trong cuộc gọi hẹn giờ vì vậy sẽ luôn gọi bộ hẹn giờ. Mặt khác, requestAnimationFrame được thiết kế đặc biệt cho những thứ trực quan, do đó trình duyệt có cơ hội không gọi hàm đánh dấu hoặc để giảm tốc độ được gọi, nếu canvas hoặc trang không hiển thị.

Đối với cách trình duyệt thực sự xử lý, tôi không chắc chắn. Tuy nhiên, bạn chắc chắn nên thích nó vì các trình duyệt trong tương lai có thể tối ưu hóa tốt hơn requestAnimationFrame theo cách mà chúng không thể tối ưu hóa setInterval hoặc setTimeout. Tôi nghĩ các trình duyệt hiện đại cũng làm giảm bộ tính giờ bình thường xuống 1 Hz nếu trang không hiển thị, nhưng nó chắc chắn dễ dàng hơn cho trình duyệt để tối ưu hóa requestAnimationFrame, cộng với một số trình duyệt giúp bạn đồng bộ hóa V và tính độc đáo khác với nó.

Vì vậy, tôi không chắc chắn requestAnimationFrame sẽ có nghĩa là chức năng đánh dấu của bạn không được gọi nếu canvas được cuộn ra khỏi chế độ xem. Vì vậy, tôi khuyên bạn nên sử dụng cả hairequestAnimationFrame và kiểm tra khả năng hiển thị hiện tại. Điều đó sẽ đảm bảo cho bạn hiển thị hiệu quả nhất.

+0

Wow, cảm ơn rất nhiều vì câu trả lời siêu kỹ lưỡng đó! Tôi đã nghe nói về 'requestAnimationFrame' trước đây, nhưng những gì luôn làm tôi nhớ về nó là nó dường như nhằm mục đích cho hoạt hình chạy ở tốc độ 60 khung hình/giây, bất kể cái gì (cái mà tôi nghĩ là quá mượt mà đối với nhiều loại hình động). Cách duy nhất để hạn chế điều này tôi có thể nghĩ đến một lần nữa bao gồm một 'setInterval' .... Bạn có biết nếu có bất kỳ cách nào để hạn chế/thay đổi điều đó? – m90

+0

Quá trơn tru? Tôi chưa bao giờ nghe nói về một hoạt hình quá mượt mà, có chuyện gì với điều đó? : S – AshleysBrain

+0

Có thể âm thanh lạ, nhưng tôi có một nền tảng trong hoạt hình cổ điển vì vậy tôi thực sự nghĩ ở tốc độ 12 khung hình/giây, suy nghĩ như thế này là một phần của bộ não của tôi bây giờ. Phản đối của tôi có thể là ngớ ngẩn trong 95% các trường hợp, nhưng đối với một số trường hợp, nó sẽ là tuyệt vời để có quyền kiểm soát nhiều hơn. – m90

2

Từ kinh nghiệm của riêng tôi, nó hiển thị bất cứ điều gì bạn yêu cầu nó hiển thị bất kể vị trí trên màn hình.

Ví dụ là nếu bạn vẽ các lát, vượt quá kích thước canvas, bạn sẽ vẫn thấy hiệu suất giảm trừ khi bạn tối ưu hóa tập lệnh.

Thử chức năng của bạn bằng hoạt ảnh yêu cầu hiệu suất và xem liệu bạn có nhận được kết quả tương tự hay không.

+0

Việc giảm mức sử dụng CPU dường như xảy ra khi toàn bộ phần tử '' được cuộn ra khỏi màn hình. Như bạn đã viết nó dường như không tạo ra sự khác biệt nếu bạn chỉ thấy chiều cao 2px của nó hoặc toàn bộ điều. – m90

+0

Đó có thể là lý do giống như khi bạn thoát khỏi trang web. Trình duyệt biết canvas không ở chế độ xem và sẽ chuyển sang chế độ chờ. Hãy thử tabbing đi và nhận được trở lại 5 phút sau đó và các hình ảnh động sẽ được khoảng nơi bạn rời nó. – justanotherhobbyist