2011-10-06 40 views
25

Dự án của tôi có Canvas HTML5 được vẽ nhiều lần trên các đối tượng đồ họa. Những vật thể này thay đổi nhanh chóng. Vẽ chúng cần có thời gian. Làm thế nào tôi có thể làm cho nó nhanh hơn?HTML5 Canvas: tốt hơn để vẽ lại các đối tượng hoặc sử dụng bitmap?

Các đối tượng không quá phức tạp nhưng chứa những thứ như vòng cung, độ dốc, đa giác.

Giao diện của một đối tượng phụ thuộc vào khoảng 10 thuộc tính mà mỗi thuộc tính có một trong khoảng 10 giá trị. Điều đó có nghĩa rằng chỉ có khoảng 100 lần xuất hiện khác với một vật thể có thể có. Đó là lý do tại sao tôi đang nghĩ về việc chỉ vẽ từng hình một và sau đó lưu vào bộ nhớ đệm một bitmap để sử dụng lại.

Tất cả những gì phải làm việc trên máy khách (ví dụ: Tôi không thể sử dụng hình ảnh làm sẵn)

  1. Điều gì sẽ là cách tốt nhất để làm điều này với HTML5 Canvas?
  2. Đó có phải là một ý tưởng hay ở tất cả hoặc là chi phí làm việc với bitmap lớn hơn vẽ lại các đối tượng mỗi lần?

Trả lời

25

Bộ nhớ cache bộ nhớ cache cache! Hãy xem this article by Simon Sarrismy own findings. Về cơ bản bạn tạo một khung trong bộ nhớ sao chép nội dung ở đó và bạn có thể tái sử dụng chúng. Bạn sẽ thấy hiệu suất lớn tăng lên làm điều này.

Rotating sprites without caching

Rotating sprites WITH caching (đi lên để tìm ra zombie)

Bạn sẽ thấy một sự cải thiện khá lớn trong ví dụ 2.

EDIT

jsfiddle example cached

jsfiddle example not cached

Simon posted này trong các ý kiến, mà nên điều thực sự rõ ràng lên nếu bạn có thể không nhìn thấy lợi nhuận thực hiện bằng cách chỉ nhìn vào bản demo.

JSperf findings by Simon Sarris

+0

Tôi đã thử bản trình diễn của bạn và trên Firefox7 trên win7 Tôi không thể thấy nhiều sự khác biệt giữa bộ đệm ẩn và không lưu trong bộ nhớ cache. Tôi vẫn đồng tình với việc sử dụng bộ nhớ đệm vì khi vẽ bộ nhớ cache "đối tượng" (đa giác/gradient) là MUCH nhanh hơn. Lý do để quay nhanh hơn nhiều khi bộ nhớ đệm là do hỗ trợ api dựng hình của các trình duyệt mới hơn – Niko

+2

Ngoài ra, bài viết này thật tuyệt vời cho các mẹo về hiệu suất canvas: http://www.html5rocks.com/en/tutorials/canvas/performance/ –

+0

@Niko Tôi cần cập nhật bản trình diễn của mình khá cũ, hiệu suất chính mà bạn thấy là khi bạn thêm vài trăm nữa trên màn hình. – Loktar

1

Tùy thuộc vào có bao nhiêu đối tượng có thể thay đổi trong một giây, và consequentially có bao nhiêu đối tượng bạn phải vẽ lại và làm thế nào - trong cùng một thứ hai, vẽ lại hơn bộ nhớ đệm có thể được khá một lựa chọn.

Nói chung, tôi khuyên bạn nên xem xét đường dẫn quyết định sau đây.

Bạn đã đề cập rằng có thể có 100 cách khác nhau để một trong các đối tượng của bạn xuất hiện.

Điều này có thể được coi là tương tự như tối thiểu là 99^2 chuyển tiếp trạng thái có thể về mặt lý thuyết cho từng đối tượng của bạn.

Những chuyển tiếp trạng thái có ấn tượng về hình dạng/kích thước/màu sắc, nhưng chúng vẫn được xác định rõ, được đánh dấu và quản lý? Nếu vậy, bộ nhớ đệm chỉ một lần 100 lần xuất hiện khác nhau được sử dụng bởi tất cả các đối tượng của bạn có thể là một cải tiến hiệu suất đáng kể.

Ngược lại, nếu - ví dụ - nền hầu như không thay đổi và phần được vẽ chiếm một phần ít liên quan hơn của khu vực đối tượng, bạn có thể cân nhắc việc vẽ lại nó mỗi lần. Trong thực tế, hình ảnh được hiển thị trước không thể phù hợp với nhu cầu của bạn về hiệu suất nếu đối tượng được vẽ của bạn thay đổi động và đặc biệt trên cơ sở liên tục, vì hình ảnh được hiển thị trước cần phải được vẽ hoàn toàn ở mọi quá trình chuyển đổi trạng thái trong khi vẽ lại đối tượng có thể có nghĩa là tải ít tính toán hơn.

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