CSS3でハードウェアアクセラレーションを有効にするとパフォーマンスが低下するのはなぜですか?


82

からテストのパフォーマンスへの移行を使用して、css3実験で6000個の小さなdiv要素を移動top: 0top: 145pxています。

ハードウェアアクセラレーションを使用しないと、 GoogleChromeでスムーズに実行されます。

ハードウェアを有効にするtranslateZ(0)と、パフォーマンスによるアクセラレーションがひどくなります。

どうしてこんなことに?

これが私のサンプルコードです:http//dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


更新(2014-11-13):この質問はまだ注目を集めているので、最新のハードウェアで提供されているデモは言及された吃音が表示されなくなったとしても、問題自体はまだ存在しているように見えることを指摘したいと思います。古いデバイスでもパフォーマンスの問題が発生する可能性があります。


9
本当の問題は、一部のブラウザが、ハードウェアアクセラレーションをアクティブにするために、「null」変換のようなばかげたハックに頼ることを著者に望んでいる理由です。Firefoxは可能な限りGPUに依存しますが、IEはすべてを加速することを選択します。しかし、ここで興味深い質問があります。これは、このようなハッキングがときどき裏目に出る可能性があることを示しているようです。
–BoltClock

2
@ BoltClock'saUnicorn基本的に私はあなたに同意します。しかし、クロスブラウザの問題では常にこのようになっているのではないでしょうか。:-)
Timo

6
かなり前にこの質問をしましたが、移動したアイテムの数が問題に大きな影響を与えているように見えることに気づきました。3Dアクセラレーションを使用する場合、3DアクセラレーションされたすべてのレイヤーをGPUに転送して戻す必要があるため、大きなオブジェクトをいくつか移動する方が、小さなアイテムをたくさん移動するよりもパフォーマンスが高くなります。そのため、GPUが適切に機能していても、多くのオブジェクトの転送が問題になる可能性があるため、GPUアクセラレーションを使用する価値がない可能性があります。
ティモ

1
どのブラウザの例でもパフォーマンスの違いは見られず、再現性がなくなったため、終了することに投票しました。
ジェイソンC

1
@Timo最新のFirefoxとChromeが何であるかを確認したところ、Windows 7 64ビットのIE11、nVidia4200Mを搭載したかなり古い2.3GHz i5 Thinkpadで、どちらのオプションもスムーズに思えます。肩をすくめる
ジェイソンC

回答:


100

私はいつも追加します:

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

3D変換を使用する場合。「偽の」3D変換でさえ。経験によれば、これらの2つの行は、特にiPadだけでなく、Chromeでも常にパフォーマンスを向上させます。

私はあなたの例でテストをしました、そして私が知る限り、それはうまくいきます。

あなたの質問の「なぜ」の部分については...わかりません。3D変換は若い標準であるため、実装が途切れます。それが接頭辞付きのプロパティである理由です:ベータテスト用。誰かがバグレポートや質問に記入して、チームに調査してもらうことができます。

2013年8月19日ごとに編集

この回答には定期的な活動があり、IE10にもこれが必要であることがわかりました。だから忘れないでください:

backface-visibility: hidden;
perspective: 1000;

3
私は別のテストをしました。基本的にテスト#1と同じですが、今回は-webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.htmlを介してボックスもz軸を中心に回転させます-今回はハードウェアアクセラレーションバージョンの方が高速です!回転を削除すると、ハードウェアアクセラレーションによってアニメーションの速度が低下します。あなたの理論が本当なら、これはうまくいかないはずです(唯一の違いは私が追加したことだからですrotateZ(360))。一方、クロムは、Z軸を中心に回転する場合、それらのタイルの裏側を再描画する必要がないことを理解するのに十分賢いのではないでしょうか。
ティモ

1
これはiOS6ではもはや当てはまりません:
Michael

2
@Timoただ注意してください、w3schoolsはw3cと提携していません:w3fools.com
カイルロビンソンヤング

7
一般的な「これを追加するだけ」だけでなく、これらの行を追加する場所を追加する必要があります。
vsync 2014

4
アニメーション化する要素の親に追加します。
mddw 2015年

7

null変換ハックtranslateZ(0))を追加したときにアニメーションが遅くなった理由は、各null3D変換が新しいレイヤーを作成するためです。これらのレイヤーが多すぎると、ブラウザーが多くのテクスチャをGPUに送信する必要があるため、レンダリングのパフォーマンスが低下します。

この問題は、2013年にAppleのホームページで気づかれ、ヌル変換ハックを悪用しました。http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/を参照してください

OPはまた彼らのコメントの説明に正しく気づきました:

3Dアクセラレーションを使用する場合、3DアクセラレーションされたすべてのレイヤーをGPUに転送して戻す必要があるため、大きなオブジェクトをいくつか移動する方が、小さなアイテムをたくさん移動するよりもパフォーマンスが高くなります。そのため、GPUが適切に機能していても、多くのオブジェクトの転送が問題になる可能性があるため、GPUアクセラレーションを使用する価値がない可能性があります。


6

面白い。私はいくつかのオプションabout:flags、特にこれらのオプションで遊んでみました:

すべてのページでのGPU合成GPUアクセラレーションレイヤーを含むページだけでなく、すべてのページでGPUアクセラレーションによる合成を使用します。

GPUアクセラレーテッド描画合成が有効になっている場合、ページコンテンツのGPUアクセラレーション描画を有効にします。

GPU Accelerated Canvas 2Dグラフィックプロセッサユニット(GPU)ハードウェアを使用してレンダリングすることにより、2Dコンテキストでキャンバスタグのパフォーマンスを向上させます。

それらを有効にし、試してみましたが、チェックボックスを有効にすると惨めに失敗しました(あなたがしたように)。しかし、それから私はさらに別のオプションに気づきました:

FPSカウンターハードウェアアクセラレーションがアクティブな場合の、ページの実際のフレームレートを1秒あたりのフレーム数で表示します 。

フラグの説明のハイライトを考えると、上記のオプションがオンになっているFPSカウンターを見たので、チェックボックスがオンになっていない場合でも、実際にはハードウェアアクセラレーションがオンになっていると思います。

TL; DR:ハードウェアアクセラレーションは、最終的にはユーザーの好みです。ダミーで強制すると、translateZ(0)冗長な処理オーバーヘッドが発生し、パフォーマンスが低下するように見えます。


2
さて、これをチェックしてください。私は別のテストをしました。基本的にテスト#1と同じですが、今回は-webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.htmlを追加して、ボックスを独自の軸を中心に回転させます。今回は、ハードウェアアクセラレーションバージョンの方が高速です。回転を削除すると、ハードウェアアクセラレーションによってアニメーションの速度が低下します。
ティモ

@valmar:fpsカウンターを有効にしていますか?この新しい例では、チェックボックスの設定方法に関係なく、ハードウェアアクセラレーションが強制されていることを意味します。私はあなたの質問は「なぜあるつまるところ推測translateZ(0)より遅いrotateZ(360deg)
OV

実は違う。translateZ(0)常にアクティブです。実際には、3Dアクセラレーションをトリガーする必要があります。rotateZ(360deg)回転アニメーションを追加するだけです。つまり、質問は次のとおりです。3Dハードウェアアクセラレーションを使用したアニメーションは、使用しrotateZ(360deg)ない場合よりもスムーズなのはなぜですか。
ティモ

1
信じられない。重い画像の回転は、ハードウェアアクセラレーションなしで高速になります...
ProblemsOfSumit

0

chromeのchrome:// flagsを確認してください。それは言う

「スレッド化された合成が有効になっている場合、高速化されたCSSアニメーションは合成スレッドで実行されます。ただし、高速化されたCSSアニメーションを使用すると、コンポジタースレッドがなくても、パフォーマンスが向上する可能性があります。」


ここのchrome:// flagsでそのオプションを見つけることができません。その機能をオフにした場合、ハードウェアアクセラレーションバージョンは、アクセラレーションされていないバージョンよりも高速ですか?
ティモ

現在、このオプションはDevTools設定にあります
Dmitry Pashkevich

0

私の経験では、GPUは一般的にすべての種類のグラフィックスで高速ではありません。非常に「基本的な」グラフィックの場合、速度が遅くなる可能性があります。

画像を回転させていた場合は、異なる結果が得られた可能性があります。これは、GPUが得意とする種類のことです。

また、translateZ(0)は3次元の演算であり、上または左の変更は2次元の演算であると考えてください。


おそらくその実装の問題です。GPUは、正しく実装されている限り、すべてのグラフィックスではるかに高速です;)
scientiaesthete 2012

1
translateZ(0)実際には、3Dハードウェアアクセラレーションを「アクティブ化」するだけです。これはハックですが、機能します。そのcss属性を追加すると、選択したhtml要素とすべての子要素がCPUではなくGPUによって強制的に計算されます。
ティモ

低レベルの実装の詳細をすべて知りません。QTでも同様の問題が発生しました。ハードウェアアクセラレーションによって速度が低下します。translateZ(0)を無視でき、変換を2次元の移動として処理できることをコンピューターが認識した時点(またはそのかどうか)はわかりません。(パースペクティブなし、アンチエイリアシングなし、すべてのピクセルに対してz + = 0なし)
sabof 2012

科学者、GPUは、コマンドとメモリをGPUとGPUメモリに移動するのにCPUの労力がかかるため、すべてのグラフィックスの計算を実行するのに高速ではありません。その努力が価値あるものになるには、複雑さの限界点があります。YMMV <事前組み立てハンドオプティマイザーはこちら;)
tomByrer 2013年

GPUは、実際の計算部分でははるかに高速です。ただし、現在利用可能なすべてのGPUには、実際の計算を開始する前にかなり重いセットアップフェーズがあります。「単純な」コンテンツの場合、CPUにすべてのレンダリングを実行させると、GPUセットアップ+ GPU計算よりも高速になる場合があります。適切に実装されたブラウザは自動的に正しい選択を行い、ランダムなコンテンツ作成者がこれ以上うまくいく方法はありません。
ミッコランタライネン2014

-2

私はあなたに2つのデモを見ました、私はあなたが混乱した理由を知っていると思います:

  1. アニメーション要素左または上を使用して場所を変更しないでください。-webkit-transformを使用してみてください。
  2. すべての子要素は、translateZ()やtranslate3Dの使用などのハードウェアアクセラレーションをオンにする必要があります。
  3. FPSはアニメーションの流暢さを測定し、デモFPSは平均でわずか20FPSです。

上記、個人的な意見のみ、ありがとうございます!


Stack Overflowへようこそ!投稿に署名/キャッチフレーズを使用しないでください。ユーザーボックスは署名としてカウントされ、プロフィールを使用して自分に関する情報を投稿できます。署名/キャッチフレーズに関するFAQ–
Andrew Barber

3
理由についてはすでに説明しましたが、リンクしたFAQエントリにも理由が記載されています。あなたはすでに署名を持っています-右を見てください。そこにはあなたの名前とアバターの写真が表示されています。
Andrew Barber

好吧、你「淫」了不过还是很感谢、还不太熟悉「StackOverflowの」的规则。。
一丝冰凉

1
どういたしまして。また、これは英語のみのWebサイトであることに注意してください。:)あなたの名前は大丈夫ですが、あなたの投稿は英語で行われるべきです。
Andrew Barber

3
苦逼了、私は英語を話せません、許してください。
丝冰凉2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.