2012-11-20 52 views
6

Tôi đang xây dựng một ứng dụng web dựa trên rất nhiều svg. Để tham khảo, tôi đang sử dụng thư viện raphael js để giải quyết tất cả.Tốc độ phần tử văn bản SVG

Trong trường hợp cụ thể này, tôi đã thực hiện một cái gì đó bắt chước một thanh cuộn và di chuyển bó các tính năng svg (~ 500 phần tử) trên màn hình. Một phần của các tính năng đó là các yếu tố <text> (~ 100). Các yếu tố khác bao gồm các yếu tố <rect>, <image><path>.

Vì vậy, tôi nhận thấy rằng ứng dụng của tôi không thực sự rất linh hoạt trên máy tính xách tay của tôi, và là xuống phải gây phiền nhiễu để đối phó với trên một ipad, do tốc độ. Tuy nhiên, bất cứ khi nào các phần tử văn bản bị xóa hoặc bỏ qua trong khi di chuyển, nó ngay lập tức được tăng tốc.

Tôi đã thử làm một số xét nghiệm tốc độ (những người rất thô, sử dụng new Date().getTime()) và phát hiện ra rằng phải mất ~ 10 ms để di chuyển tất cả các yếu tố ngoại trừ <text> yếu tố, tuy nhiên phải mất ~ 120 ms khi <text> yếu tố được đưa vào. Tôi tin rằng điều này xảy ra vì mỗi chữ cái được hiển thị dưới dạng hình dạng vectơ và phải mất nhiều công suất xử lý để tính toán chính xác những gì bị che khuất bởi cấu trúc phức tạp như vậy.

Có thể chỉ nhúng văn bản để văn bản được hiển thị dưới dạng hình ảnh raster chứ không phải dưới dạng hình dạng không? Hoặc cải thiện hiệu suất hiển thị văn bản theo bất kỳ cách nào khác?

Tôi không cần độ trong suốt nền và tôi không sử dụng bất kỳ phông chữ lạ mắt nào.

+0

Bạn đang sử dụng 'paper.print()' hoặc 'paper.text()' để tạo thành phần văn bản của mình. Ngoài ra một fiddle có thể là tốt. – Bruno

+0

Bạn có đang nhắm mục tiêu một bộ trình duyệt cụ thể không? Hiệu suất khác nhau đáng kể giữa các trình duyệt. – Sebastian

+0

@Bruno Tôi đang sử dụng paper.text(), vẫn còn khá chậm. – gintas

Trả lời

3

Bạn có thể hiển thị trước văn bản bằng Canvas và embed images into the SVG. Tôi không biết điều này so sánh với việc hiển thị phần tử văn bản nói chung như thế nào, nhưng đối với our demos hoạt động khá tốt (xem bóng thả trong ví dụ "phân cấp" - chúng được đưa vào canvas trước và sau đó được sao chép và tham chiếu từ bên trong SVG) . Lưu ý rằng các bản trình diễn này cũng tận dụng ảo hóa, tức là nếu bạn phóng to hình ảnh và chỉ một số phần tử thực sự nằm trong chế độ xem, các phần tử khác sẽ bị xóa khỏi SVG, tăng tốc rất lớn.

Trình diễn làm nhiều thứ hơn là chỉ di chuyển các phần tử xung quanh, vì vậy sẽ dễ dàng để có được hiệu suất giống nhau hoặc thậm chí tốt hơn.

Tôi không biết làm thế nào để làm điều này với raphael, tuy nhiên, nhưng tôi tin rằng bạn sẽ có thể đặt url dữ liệu từ hình ảnh canvas vào SVG với raphael, quá.

+0

Điều đó nghe có vẻ giống như một giải pháp thú vị. Sẽ thử ngay bây giờ. – gintas

2

Paper.print() theo trang web của Raphael

Tạo con đường mà đại diện cho cho văn bản viết bằng phông chữ được đưa ra tại vị trí nhất định với kích thước nhất định

Về cơ bản văn bản của bạn được chuyển thành một con đường. Rõ ràng điều này có vấn đề hiệu suất.

Có lẽ tốt nhất nên sử dụng giấy .text()

CẬP NHẬT

Vì vậy, không hài lòng với chỉ dishing ra lời khuyên tôi đã thiết lập một số xét nghiệm trên http://www.jsperf.com. Chúng có thể được sử dụng để so sánh sự khác biệt về hiệu suất để tạo hoạt ảnh và chuyển đổi các loại đối tượng Raphael khác nhau.

Nếu bạn chạy các ứng dụng này trên iPad, nó sẽ hiển thị nếu các yếu tố văn bản thực sự di chuyển chậm hơn nhiều. Một điều cần lưu ý là, ít nhất là trong các bài kiểm tra tôi chạy, paper.print() và paper.text() không khác biệt về hiệu suất.

Run the tests on jsperf

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