CSS3'te donanım hızlandırmayı etkinleştirmek neden performansı yavaşlatıyor?


82

Ben bir geçişi kullanarak bir css3 deneyde 6000 küçük div öğelerini taşınacağım top: 0için top: 145pxtest performansı.

Kullanılması hiçbir donanım hızlandırma Google Chrome'da düzgün çalışır.

translateZ(0)Performans yoluyla donanım hızlandırmayı etkinleştirirsem korkunç olur.

Neden böyle?

İşte örnek kodum: http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


Güncelleme (2014-11-13): Bu soru hala dikkatleri üzerine çektiğinden, söz konusu kekemelik modern donanımla ilgili sunulan demoda artık görünmese de sorunun kendisinin hala var gibi göründüğünü belirtmek isterim . Daha eski cihazlar hala performans sorunları görebilir.


9
Asıl soru, bazı tarayıcıların neden yazarların donanım hızlandırmayı etkinleştirmek için "boş" dönüşümler gibi aptalca saldırılara başvurmasını istedikleridir. Firefox, GPU'yu olabildiğince erteliyor, IE ise HER ŞEYİ HIZLANDIRMAYI seçiyor! Ama yine de burada ilginç bir soru, çünkü bu tür saldırıların bazen geri tepebileceğini gösteriyor gibi görünüyor.
BoltClock

2
@ BoltClock'saUnicorn Temelde sana katılıyorum. Ancak tarayıcılar arası sorunlarda her zaman böyle olmadı mı? :-)
Timo

6
Bu soruyu epey bir süre önce sordum, ancak taşınan öğelerin sayısının sorun üzerinde büyük bir etkiye sahip olduğunu fark ettim. Birkaç büyük nesneyi taşımak, 3B hızlandırma kullanılırken çok sayıda küçük öğeyi taşımaktan daha performanslıdır çünkü tüm 3B hızlandırmalı katmanların GPU'ya ve geri dönüş yoluna aktarılması gerekir. Dolayısıyla, GPU iyi bir iş çıkarsa bile, birçok nesnenin aktarımı bir sorun olabilir, bu nedenle GPU hızlandırmayı kullanmaya değmeyebilir.
Timo

1
Herhangi bir tarayıcıdaki örnekte performans farkı görmüyorum ve artık yeniden üretilemeyeceği için kapatmaya oy verdim.
Jason C

1
@Timo En son Firefox ve Chrome ne olursa olsun kontrol ettim ve Windows 7 64-bit'te IE11, nVidia 4200M ile oldukça eski bir 2.3 GHz i5 Thinkpad'de, her iki seçenek de bana sorunsuz görünüyor. omuz silkme
Jason C

Yanıtlar:


100

Ben her zaman eklerim:

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

3 boyutlu dönüştürme ile çalışırken. Hatta "sahte" 3D dönüşümler bile. Deneyimler bana, bu iki satırın özellikle iPad'de ve aynı zamanda Chrome'da performansı her zaman iyileştirdiğini söylüyor.

Örneğiniz üzerinde test yaptım ve anlayabildiğim kadarıyla işe yarıyor.

Sorunuzun "neden" kısmına gelince ... Bilmiyorum. 3B dönüştürme yeni bir standarttır, bu nedenle uygulama dalgalı. Bu nedenle, önekli bir özelliktir: beta testi için. Birisi bir hata raporu veya soru doldurabilir ve ekibin araştırmasını sağlayabilir.

19 Ağustos 2013'e göre düzenleme :

Bu cevapta düzenli bir faaliyet var ve IE10'un da buna ihtiyacı olduğunu bulmak için bir saat kaybettim. Bu yüzden unutma:

backface-visibility: hidden;
perspective: 1000;

3
Başka bir test daha yaptım. Temelde test # 1 ile aynı ama bu sefer -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html aracılığıyla kutuların z ekseni etrafında dönmesine izin verdim - Bu sefer donanım hızlandırmalı sürüm daha hızlı! Döndürmeyi kaldırırsam, donanım hızlandırma animasyonu yavaşlatır. Teoriniz doğruysa, bu işe yaramamalı (çünkü tek fark benim eklememdir rotateZ(360)). Öte yandan, belki de krom, Z ekseni etrafında bir dönüş için bu döşemelerin arka tarafının yeniden çizilmesine gerek olmadığını anlayacak kadar akıllıdır?
Timo


2
@Timo Sadece bir uyarı, w3schools
Kyle Robinson Young,

7
Eklemek gerekir nerede sadece genel değil, bu satırları eklemek için kendimi nerede olduğunu "Sadece bu eklemek ..", ancak birçok olmaz.
vsync

4
Animasyon uyguladığınız öğelerin üst öğelerine ekleyin.
mddw

7

Boş dönüşüm hack ( translateZ(0)) eklediğinizde animasyonun daha yavaş olmasının nedeni , her boş 3B dönüşümün yeni bir katman oluşturmasıdır. Bu katmanlardan çok fazla olduğunda, tarayıcının GPU'ya çok sayıda doku göndermesi gerektiğinden işleme performansı düşer.

Sorun, boş dönüşüm hackini kötüye kullanan Apple'ın ana sayfasında 2013 yılında fark edildi. Bkz. Http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/

OP ayrıca yorumundaki açıklamayı doğru bir şekilde fark etti :

Birkaç büyük nesneyi taşımak, 3B hızlandırma kullanılırken çok sayıda küçük öğeyi taşımaktan daha performanslıdır çünkü tüm 3B hızlandırmalı katmanların GPU'ya ve geri dönüş yoluna aktarılması gerekir. Dolayısıyla, GPU iyi bir iş çıkarsa bile, birçok nesnenin aktarımı bir sorun olabilir, bu nedenle GPU hızlandırmayı kullanmaya değmeyebilir.


6

İlginç. Birkaç seçenekle oynamayı denedim about:flags, özellikle aşağıdakiler:

Tüm sayfalarda GPU birleştirme Yalnızca GPU hızlandırmalı katmanları içerenlerde değil, tüm sayfalarda GPU hızlandırmalı birleştirme kullanır.

GPU Hızlandırılmış Çizim Birleştirme etkinleştirildiğinde sayfa içeriğinin GPU hızlandırmalı çizimini etkinleştirin.

GPU Hızlandırılmış Kanvas 2D , Grafik İşlemci Birimi (GPU) donanımı kullanarak oluşturarak 2D bağlamla daha yüksek performans gösteren tuval etiketleri sağlar.

Bunları etkinleştirdi, denedi ve onay kutusu etkinken berbat bir şekilde başarısız oldu (tıpkı sizin yaptığınız gibi) Ama sonra başka bir seçenek daha fark ettim:

FPS sayacı Donanım hızlandırma etkinken sayfanın gerçek kare hızını saniye başına kare cinsinden gösterir .

Bayrak açıklamasındaki vurgu göz önüne alındığında, yukarıdaki seçenekler açıkken FPS sayacını gördüğümden, donanım hızlandırmanın aslında işaretli onay kutusu olmadan bile benim için açık olduğunu tahmin ediyorum!

TL; DR: donanım hızlandırma, sonuçta bir kullanıcı tercihidir; kukla ile zorlamak translateZ(0), daha düşük performans görünümü vererek fazladan işlem yükü getirecektir.


2
O zaman şuna bir bak. Başka bir test daha yaptım. Temelde test # 1 ile aynı ama bu sefer ek olarak -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html ekleyerek kutuların kendi eksenleri etrafında dönmesine izin verdim - Bu sefer donanım hızlandırmalı sürüm daha hızlı! Dönüşü kaldırırsam, donanım hızlandırma animasyonu yavaşlatır.
Timo

@valmar: fps sayacını etkinleştiriyor musunuz? Bu yeni örnekte, onay kutusunu nasıl ayarladığımdan bağımsız olarak, donanım hızlandırmanın hala zorlandığı anlamına geldiğini görüyorum. Sanırım sorunuz "neden daha translateZ(0)yavaş rotateZ(360deg)" şeklinde
özetleniyor

Aslında hayır. translateZ(0)HER ZAMAN aktiftir. Aslında 3B hızlanmayı tetiklemek gerekiyor. rotateZ(360deg)sadece ek olarak rotasyon animasyonunu ekler. Öyleyse şunu söyleyebilirim: Neden 3B donanım hızlandırmalı animasyon rotateZ(360deg)olmadan daha akıcı ?
Timo

1
inanamıyorum. Donanım hızlandırması olmadan ağır görüntülerin döndürülmesi daha hızlıdır ...
ProblemsOfSumit

0

Chrome'daki chrome: // flags'ı kontrol edin. Diyor ki

"Dizi halinde birleştirme etkinleştirildiğinde, hızlandırılmış CSS animasyonları birleştirme dizisinde çalışır. Ancak, birleştirici dizisi olmadan bile hızlandırılmış CSS animasyonlarıyla çalışan performans kazanımları olabilir."


Bu seçeneği burada chrome: // bayraklarda bulamıyorum. Bu özelliği kapatırsanız, donanım hızlandırmalı sürüm sizin için hızlandırılmamış sürümden daha mı hızlı?
Timo

Şimdi bu seçenek DevTools ayarlarında
Dmitry

0

Deneyimim, GPU'ların genellikle tüm grafik türleri için daha hızlı olmadığıdır. Çok "temel" grafikler için daha yavaş olabilirler.

Bir görüntüyü döndürüyorsanız farklı bir sonuç almış olabilirsiniz - bu, GPU'ların iyi olduğu bir şeydir

Ayrıca translateZ (0) 'ın 3 boyutlu bir işlem olduğunu, üst veya solun değiştirilmesinin 2 boyutlu bir işlem olduğunu düşünün.


Büyük olasılıkla bir uygulama sorunu. GPU'lar, doğru uyguladığınız sürece tüm grafikler için çok daha hızlıdır;)
Scientiaesthete

1
translateZ(0)aslında 3B donanım hızlandırmayı "etkinleştirmekten" başka bir şey yapmaz. Bu bir hack ama işe yarıyor. Bu css niteliğini eklerken, seçilen html öğesi ve tüm alt öğeler CPU yerine GPU tarafından zorunlu olarak hesaplanacaktır.
Timo

Tüm düşük seviyeli uygulama ayrıntılarını bilmiyorum. QT ile benzer sorunlar yaşadım - donanım hızlandırma işleri yavaşlatıyor. TranslateZ (0) 'ın göz ardı edilebileceğini ve dönüşümün 2 boyutlu hareket olarak işlenebileceğini bilgisayarın hangi noktada (veya olup olmadığını) bilmiyorum. (Her piksel için bir bakış açısı, bir anti-aliasing, herhangi bir Z * = 0)
sabof

Scientiaesthete, GPU tüm grafikler için matematik yapmak için daha hızlı değildir , çünkü komutları ve belleği GPU ve GPU belleğine taşımak CPU çabası gerektirir. Bu çabanın değer kazanması için bir kırılma noktası var. YMMV <önceki montaj el optimizeri burada;)
tomByrer

GPU'lar gerçek hesaplama kısmı için çok daha hızlıdır. Ancak, şu anda mevcut olan tüm GPU'ların gerçek hesaplama başlamadan önce oldukça ağır bir kurulum aşaması var. "Basit" içerik için, CPU'nun tüm işlemeyi yapmasına izin vermek, GPU kurulumu + GPU hesaplamasından daha hızlı olabilir. İyi uygulanmış bir tarayıcı otomatik olarak doğru seçimi yapar ve herhangi bir rastgele içerik yazarının daha iyisini yapmasının bir yolu yoktur.
Mikko Rantalainen

-2

İkinizin demosunu gördüm , Kafanızın karışmasının sebebini biliyorum galiba :

  1. Animasyon öğeleri Konumu değiştirmek için sol veya üst kullanmayın, -webkit-dönüşümünü kullanmayı deneyin;
  2. TranslateZ () veya translate3D kullanımı gibi tüm alt öğelerin donanım hızlandırmayı açması gerekir;
  3. FPS animasyon akıcılığını ölçer, demo FPS'niz ortalama olarak yalnızca 20FPS'dir.

Yukarıda sadece kişisel bir görüş, teşekkür ederim!


Stack Overflow'a hoş geldiniz! Lütfen gönderilerinizde imza / slogan kullanmayın. Kullanıcı kutunuz imzanız olarak sayılır ve profilinizi, kendinizle ilgili istediğiniz herhangi bir bilgiyi göndermek için kullanabilirsiniz. İmzalar / sloganlar hakkında SSS
Andrew Barber

3
Nedenini zaten açıkladım ve ayrıca bağlantı verdiğim SSS girişinde neden bahsedildi. Sen zaten bir imza - bu adın ve avatar resmini gösterir sağında, göz.
Andrew Barber

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

1
Rica ederim. Lütfen bunun yalnızca İngilizce bir web sitesi olduğunu unutmayın. :) İsminiz iyi ama gönderileriniz İngilizce yapılmalıdır.
Andrew Barber

3
苦 逼 了, İngilizce bilmiyorum, lütfen beni affet.
一丝 冰凉
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.