Tại sao việc bật tăng tốc phần cứng trong CSS3 lại làm chậm hiệu suất?


82

Tôi di chuyển 6.000 phần tử div nhỏ trong một thí nghiệm css3 sử dụng một quá trình chuyển đổi từ top: 0tới top: 145pxđể thực hiện thử nghiệm.

Sử dụng không tăng tốc phần cứng chạy mịn trên Google Chrome.

Nếu tôi kích hoạt tăng tốc phần cứng thông qua translateZ(0)hiệu suất sẽ trở nên kinh khủng.

Tại sao lại như vậy?

Đây là mã ví dụ của tôi: http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


Cập nhật (2014-11-13): Vì câu hỏi này vẫn đang thu hút sự chú ý, tôi muốn chỉ ra rằng bản thân vấn đề dường như vẫn tồn tại mặc dù hiện tượng nói lắp được đề cập có thể không còn hiển thị trong bản demo được cung cấp trên phần cứng hiện đại . Các thiết bị cũ hơn có thể vẫn gặp vấn đề về hiệu suất.


9
Câu hỏi thực sự là tại sao một số trình duyệt lại muốn các tác giả sử dụng đến các cách hack ngớ ngẩn như biến đổi "null" để kích hoạt tăng tốc phần cứng. Firefox càng hạn chế GPU càng tốt, trong khi IE chọn CHẤP NHẬN _ALL_ NHỮNG ĐIỀU! Nhưng câu hỏi thú vị ở đây tuy nhiên, vì nó dường như chứng minh rằng những vụ hack như thế này thậm chí đôi khi có thể phản tác dụng.
BoltClock

2
@ BoltClock'saUnicorn Về cơ bản tôi đồng ý với bạn. Nhưng không phải lúc nào nó cũng như vậy với các vấn đề trên nhiều trình duyệt? :-)
Timo

6
Tôi đã hỏi câu hỏi này khá lâu trước đây nhưng bây giờ tôi nhận thấy rằng số lượng mục được chuyển đi dường như có ảnh hưởng lớn đến vấn đề. Di chuyển một vài đối tượng lớn sẽ hiệu quả hơn so với di chuyển nhiều mục nhỏ khi sử dụng tính năng tăng tốc 3D vì tất cả các lớp được tăng tốc 3D phải được chuyển đến GPU và đường lùi. Vì vậy, ngay cả khi GPU hoạt động tốt, việc chuyển nhiều đối tượng có thể là một vấn đề khiến việc sử dụng tăng tốc GPU có thể không đáng.
Timo

1
Tôi không thấy sự khác biệt về hiệu suất trong ví dụ trên bất kỳ trình duyệt nào và đã bỏ phiếu đóng vì không thể tái tạo được nữa.
Jason C

1
@Timo Chỉ cần kiểm tra bất kỳ Firefox và Chrome mới nhất, và IE11, trên Windows 7 64-bit, trên Thinkpad i5 2,3 GHz khá cũ với nVidia 4200M, cả hai tùy chọn đều có vẻ mượt mà đối với tôi. nhún vai
Jason C

Câu trả lời:


100

Tôi luôn nói thêm:

-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;

Khi làm việc với biến đổi 3d. Thậm chí là "giả" biến hình 3D. Kinh nghiệm cho tôi biết rằng hai dòng này luôn cải thiện hiệu suất, đặc biệt là trên iPad mà cả trên Chrome.

Tôi đã thử nghiệm trên ví dụ của bạn và theo như tôi có thể nói, nó hoạt động.

Còn về phần "tại sao" trong câu hỏi của bạn thì ... mình không biết. Chuyển đổi 3D là một tiêu chuẩn trẻ, vì vậy việc triển khai rất khó khăn. Đó là lý do tại sao nó là thuộc tính có tiền tố: để thử nghiệm beta. Ai đó có thể điền vào một báo cáo lỗi hoặc một câu hỏi và yêu cầu nhóm điều tra.

Chỉnh sửa vào ngày 19 tháng 8 năm 2013 :

Có hoạt động thường xuyên về câu trả lời này và tôi chỉ mất một giờ để nhận ra rằng IE10 cũng cần điều này. Vì vậy, đừng quên:

backface-visibility: hidden;
perspective: 1000;

3
Tôi đã làm một bài kiểm tra khác. Về cơ bản giống như bài kiểm tra số 1 nhưng lần này tôi để các hộp cũng xoay quanh trục z thông qua -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html - Lần này phiên bản tăng tốc phần cứng nhanh hơn! Nếu tôi xóa tính năng xoay, tăng tốc phần cứng sẽ làm chậm hoạt ảnh. Nếu lý thuyết của bạn là đúng thì điều này sẽ không hoạt động (bởi vì sự khác biệt duy nhất là tôi đã thêm vào rotateZ(360)). Mặt khác, có lẽ chrome đủ thông minh để nhận ra rằng để quay quanh trục Z thì không cần phải vẽ lại mặt sau của những viên gạch đó?
Timo

1
Đây không còn là trường hợp trong iOS6 :-(
Michael Mullany

2
@Timo Lưu ý, w3schools không liên kết với w3c: w3fools.com
Kyle Robinson Young

7
bạn nên thêm vào nơi để thêm những dòng này, không chỉ là chung chung "chỉ thêm cái này .." bản thân tôi biết ở đâu, nhưng nhiều người không.
vsync

4
Thêm nó vào gốc của các phần tử bạn đang tạo hoạt ảnh.
mddw

7

Lý do hoạt ảnh chậm hơn khi bạn thêm hack biến đổi null (translateZ(0) ) là mỗi biến đổi 3D null tạo ra một lớp mới. Khi có quá nhiều lớp trong số này, hiệu suất hiển thị sẽ bị ảnh hưởng vì trình duyệt cần gửi nhiều kết cấu đến GPU.

Vấn đề đã được nhận thấy vào năm 2013 trên trang chủ của Apple, nơi đã lạm dụng hack biến đổi null. Xem http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Aaries-Home-Page/

OP cũng nhận thấy chính xác lời giải thích trong bình luận của họ :

Di chuyển một vài đối tượng lớn sẽ hiệu quả hơn so với di chuyển nhiều mục nhỏ khi sử dụng tính năng tăng tốc 3D vì tất cả các lớp được tăng tốc 3D phải được chuyển đến GPU và đường lùi. Vì vậy, ngay cả khi GPU hoạt động tốt, việc chuyển nhiều đối tượng có thể là một vấn đề, do đó việc sử dụng tăng tốc GPU có thể không đáng.


6

Hấp dẫn. Tôi đã thử chơi với một số tùy chọn about:flags, cụ thể là những tùy chọn sau:

Tổng hợp GPU trên tất cả các trang Sử dụng tính năng tổng hợp được tăng tốc GPU trên tất cả các trang, không chỉ những trang bao gồm các lớp được tăng tốc GPU.

GPU Accelerated Drawing Bật bản vẽ tăng tốc GPU cho nội dung trang khi tính năng tổng hợp được bật.

GPU Accelerated Canvas 2D Cho phép hiệu suất cao hơn của thẻ canvas với ngữ cảnh 2D bằng cách kết xuất bằng phần cứng Bộ xử lý đồ họa (GPU).

Đã bật những thứ đó, thử nó và thất bại thảm hại với hộp đánh dấu được bật (giống như bạn đã làm). Nhưng sau đó tôi nhận thấy một tùy chọn khác:

Bộ đếm FPS Hiển thị tốc độ khung hình thực tế của trang, tính bằng khung hình trên giây, khi tăng tốc phần cứng đang hoạt động .

Với điểm nổi bật trong mô tả cờ, tôi suy đoán rằng thực tế, tăng tốc phần cứng đã được bật đối với tôi ngay cả khi không có hộp kiểm được đánh dấu vì tôi thấy bộ đếm FPS với các tùy chọn ở trên được bật!

TL; DR: cuối cùng thì tăng tốc phần cứng là một ưu tiên của người dùng; buộc nó với giả translateZ(0)sẽ giới thiệu chi phí xử lý dư thừa khiến hiệu suất thấp hơn.


2
Vâng, sau đó kiểm tra này ra. Tôi đã làm một bài kiểm tra khác. Về cơ bản giống như thử nghiệm số 1 nhưng lần này tôi bổ sung để các hộp tự xoay quanh trục của chúng bằng cách thêm -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html - Lần này phiên bản tăng tốc phần cứng nhanh hơn! Nếu tôi loại bỏ vòng xoay, tăng tốc phần cứng sẽ làm chậm hoạt ảnh.
Timo

@valmar: bạn đang bật bộ đếm fps? Trong ví dụ mới này, tôi thấy nó bất kể cách tôi đặt hộp kiểm có nghĩa là tăng tốc phần cứng vẫn bị ép buộc. Tôi đoán câu hỏi của bạn nắm để "tại sao là translateZ(0)chậm hơn so với rotateZ(360deg)"
ov

Trên thực tế, không. translateZ(0)LUÔN LUÔN hoạt động. Nó thực sự cần thiết để kích hoạt tăng tốc 3d. rotateZ(360deg)chỉ bổ sung thêm hoạt ảnh xoay. Vì vậy, tôi muốn nói câu hỏi là: Tại sao hoạt ảnh với khả năng tăng tốc phần cứng 3D lại mượt mà rotateZ(360deg)hơn không?
Timo

1
không thể tin được. Xoay hình ảnh nặng là nhanh hơn mà không tăng tốc phần cứng ...
ProblemsOfSumit

0

Kiểm tra chrome: // flags trong chrome. Nó nói rằng

"Khi bật tính năng tổng hợp theo chuỗi, các hoạt ảnh CSS tăng tốc sẽ chạy trên chuỗi tổng hợp. Tuy nhiên, có thể tăng hiệu suất khi chạy với các hoạt ảnh CSS được tăng tốc, ngay cả khi không có chuỗi tổng hợp."


Tôi không thể tìm thấy tùy chọn đó trên chrome: // flags ở đây. Nếu bạn tắt tính năng đó, phiên bản tăng tốc phần cứng có nhanh hơn phiên bản không tăng tốc cho bạn không?
Timo

Bây giờ tùy chọn này trong cài đặt DevTools
Dmitry Pashkevich

0

Kinh nghiệm của tôi là GPU thường không nhanh hơn cho tất cả các loại đồ họa. Đối với đồ họa rất "cơ bản", chúng có thể chậm hơn.

Bạn có thể nhận được kết quả khác nếu bạn đang xoay một hình ảnh - đó là loại GPU giỏi

Cũng nên xem xét rằng translateZ (0) là một hoạt động trong 3 chiều, trong khi thay đổi trên cùng hoặc trái là một hoạt động 2 chiều


Rất có thể đó là một vấn đề triển khai. GPU là nhanh hơn nhiều cho tất cả các đồ họa, miễn là bạn thực hiện nó ngay;)
scientiaesthete

1
translateZ(0)thực sự không làm gì khác ngoài "kích hoạt" tăng tốc phần cứng 3D. Đó là một cuộc tấn công nhưng nó hoạt động. Khi thêm thuộc tính css đó, phần tử html đã chọn cũng như tất cả các phần tử con sẽ được GPU tính toán mạnh hơn là CPU.
Timo

Tôi không biết tất cả các chi tiết triển khai cấp thấp. Tôi đã gặp vấn đề tương tự với QT - tăng tốc phần cứng làm chậm mọi thứ. Tôi không biết tại thời điểm nào (hoặc liệu) máy tính có nhận ra rằng translateZ (0) có thể bị bỏ qua hay không và quá trình chuyển đổi có thể được xử lý như chuyển động theo 2 chiều. (Không có quan điểm, không có anti-aliasing, không có z + = 0 cho mỗi điểm ảnh)
sabof

Khoa học giáo dục, GPU không nhanh hơn để thực hiện phép toán cho tất cả đồ họa, vì CPU cần nỗ lực để di chuyển các lệnh & bộ nhớ sang GPU & bộ nhớ GPU. Có một điểm phức tạp để nỗ lực đó trở nên có giá trị trong thời gian đó. YMMV <trước lắp ráp bằng tay ưu đây;)
tomByrer

GPU nhanh hơn nhiều cho phần tính toán thực tế. Tuy nhiên, tất cả các GPU hiện có đều có giai đoạn thiết lập khá nặng trước khi quá trình tính toán thực sự có thể bắt đầu. Đối với nội dung "đơn giản", việc để CPU thực hiện tất cả việc hiển thị có thể nhanh hơn thiết lập GPU + tính toán GPU. Một trình duyệt được triển khai tốt sẽ tự động thực hiện lựa chọn phù hợp và không có cách nào mà bất kỳ tác giả nội dung ngẫu nhiên nào có thể làm tốt hơn.
Mikko Rantalainen

-2

Tôi đã xem bản demo của hai bạn , Tôi nghĩ tôi biết lý do khiến bạn bối rối :

  1. Các yếu tố hoạt hình Không sử dụng bên trái hoặc trên cùng để thay đổi vị trí, hãy thử sử dụng -webkit-biến đổi;
  2. Tất cả các phần tử con cần bật tăng tốc phần cứng như sử dụng translateZ () hoặc translate3D;
  3. FPS đo độ trôi chảy của hoạt ảnh, FPS demo của bạn trung bình chỉ 20FPS.

Trên đây chỉ là ý kiến ​​cá nhân, xin cảm ơn!


Chào mừng bạn đến với Stack Overflow! Vui lòng không sử dụng chữ ký / khẩu hiệu trong bài viết của bạn. Hộp người dùng của bạn được coi là chữ ký của bạn và bạn có thể sử dụng hồ sơ của mình để đăng bất kỳ thông tin nào về bản thân mà bạn thích. Hỏi đáp về chữ ký / tagline
Andrew Barber

3
Tôi đã giải thích lý do tại sao và nó cũng được đề cập tại sao trong mục Câu hỏi thường gặp mà tôi đã liên kết đến. Bạn đã có chữ ký - hãy nhìn sang bên phải, nơi nó hiển thị tên và ảnh đại diện của bạn.
Andrew Barber

好吧 , 你 “淫” 了。 不过 还是 很 感谢 , 还 不太 熟悉 “stackoverflow” 的 规则。
一丝 冰凉

1
Không có gì. Cũng xin lưu ý rằng đây là trang web chỉ có tiếng Anh. :) Tên của bạn cũng được, nhưng bài viết của bạn nên được viết bằng tiếng Anh, làm ơn.
Andrew Barber

3
苦 逼 了, tôi không nói được tiếng Anh, xin hãy tha thứ cho tôi.
一丝 冰凉
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.