CSSアニメーションでハードウェアアクセラレーションが有効になっているかどうかを(テスト目的で)に確認するにはどうすればよいですか?
要素を本質的に拡大してフルスクリーンにする次のコードがあります(HTML5フルスクリーンAPIを使用せずに)。 jQueryアニメーションを使用する場合、ほとんどの携帯電話で喘ぎカメのように動作するため、代わりにCSS3を使用しました。
ここにjsFiddleの例があります:
$("#makeFullscreen").on("click", function() {
var map = $("#map"),
mapTop = map.offset().top,
mapLeft = map.offset().left;
$("#map").css({
"position": "fixed",
"top": mapTop,
"left": mapLeft,
"width": map.outerWidth(true),
"height": map.outerHeight(true)
});
setTimeout(function(){map.addClass("fullscreen")},1);
return false;
});
.mapContainer {
width: 150px;
height: 200px;
position: relative;
margin: 0 auto;
}
.map {
background: #00f;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
text-align: center;
}
.fullscreen {
-webkit-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
-moz-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
-ms-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
-o-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
top: 0 !important;
left: 0 !important;
width: 100% !important;
height: 100% !important;
}
#makeFullscreen {
margin-top: 20px;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mapContainer">
<div id="map" class="map">
<button id="makeFullscreen">Make Fullscreen</button>
</div>
</div>
これにより、クラスが追加され、要素はCSS遷移を使用してある状態から次の状態に遷移します。これはjQueryよりも高速ですが、iOSとAndroidではまだ途切れ途切れです。
しかし、私は here を読みました。このように、本質的に何もしない3D変換を指定することで、GPUを使用して遷移を強制的に加速できます。
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
しかし、それを私のCSSに追加した後、視覚的な改善は見られません。
ブラウザーの開発ツールでハードウェアアクセラレーションが有効になっているかどうかを確認する方法はありますか?スクリプトでこれを検出する必要はありません。テスト目的で知りたいだけです。
要素のCSSプロパティ遷移は、次のすべての条件が満たされている場合、ハードウェアアクセラレーションになります。
一般に、これらの条件の要件は次のとおりです。
opacity
、transform: translate
/scale
/rotate
など)のみが高速化可能ですtransform: translate3d
のような「高速化」ハックを使用して強制することができます)これが有効になっているかどうかを確認するには:
chrome://settings
に移動アクセラレーションが有効な場合、次のようになります。
chrome://gpu
に移動docs のSoftware Compositorの詳細:
一部の状況では、ハードウェア合成は実行不可能です。デバイスのグラフィックスドライバーが ブラックリスト であるか、デバイスにGPUが完全に不足している場合。これらの状況では、GLレンダラーと呼ばれるSoftwareRendererの代替実装です。
(注:Chromeには レガシーソフトウェアレンダリングパス もあります。これは「2014年5月の時点ではまだ残っていますが、まもなく完全にBlinkから削除されます。」)
詳細は次の記事をご覧ください: Chromeでの高速レンダリング 。
アクセラレーションが有効な場合、次のようになります。
about:config
に移動layers.acceleration.disabled
を検索レイヤーアクセラレーションが有効な場合(値がfalse
の場合)、次のようになります。
about:support
に移動0/
で始まらず、レンダリングAPIが表示されている場合(OpenGL、Direct3Dなど)、GPUアクセラレーションはアクティブです。
defaults write com.Apple.Safari IncludeInternalDebugMenu 1
ハードウェアアクセラレーションが可能な唯一のCSSプロパティの遷移は、レンダリングプロセスの合成ステージで発生するものです。例えば:
opacity
transform: translate
およびその友達: translateX
、 translateY
、 translateZ
、 translate3d
transform: scale
およびその友達: scaleX
、 scaleY
、 scaleZ
、 scale3d
transform: rotate
およびその友達: rotateX
、 rotateY
、 rotateZ
、 rotate3d
アクセラレーションを最大限に活用するには、非合成プロパティを移行する必要はありません。例えば:
transform: translate
だけでのトランジションは、加速のメリットをすべて享受できます(要素のレイヤーはGPUによって単純に再合成できるため)。transform: translate
とwidth
の両方のトランジションは、アクセラレーションからほとんど利益を得ません(width
のトランジションは要素のレイヤーを引き起こすため)アニメーションフレームごとにCPUによって再描画されます)。ブラウザのレンダリングエンジンは、要素に独自の合成レイヤーを与えるかどうかを(ユーザー設定、CSSスタイルなどに基づいて)決定します。
たとえば、Chromeには この理由のリスト があり、chrome://flags
にもこのオプションがあります。
トランジション付きのRenderLayersの合成
このオプションを有効にすると、不透明度、変換、またはフィルターに遷移するRenderLayersに独自の合成レイヤーが作成されます。
要素に独自のレイヤーが与えられていない場合、その要素のCSS遷移は加速されません。
transform: translate3d
( 「もっと速く」ハック )は通常、要素に独自のレイヤーを強制的に適用します。
ただし、要素に独自のレイヤーが指定されている場合でも、非合成プロパティ(width
、height
、left
、top
など)への遷移まだ加速することはできません。これは、合成段階の前に発生するためです(たとえば、レイアウト段階またはペイント段階)。 @ChrisSpittlesこれが、transform: translate3d
を追加した後に視覚的な改善が見られなかった理由です。
ほとんどのブラウザーは、複合レイヤーの周りに色付きの境界線を表示して、開発/デバッグのためにそれらを簡単に識別できるようにすることができます。
合成レイヤーの境界線の表示は、次の2つの方法のいずれかで実行できます。
chrome://flags
に移動し、合成レンダーレイヤーの境界線を有効にします(「レイヤー合成のデバッグと調査に役立つように、合成レンダーレイヤーの周囲に境界線をレンダリングします」 )。これを有効にするには、Chromeを再起動する必要があります。次に、要素のCSS遷移をトリガーします。色付きの境界線がある場合は、独自の合成レイヤーがあります。
境界線の色とその意味は debug_colors.cc
で定義されています。詳細 ここ および ここ 。
合成レイヤーの境界線を描くには:
about:config
に移動layers.draw-borders
を検索して有効にします次に、要素のCSS遷移をトリガーします。色付きの境界線がある場合は、独自の合成レイヤーがあります。
境界線の色とその意味は Compositor::DrawDiagnosticsInternal
で定義されています。
(これはSafari 7.0.3では私には機能しませんが、一部の人には機能したようです 最近のように 。)
CA_COLOR_OPAQUE
ブール環境変数を設定して、ターミナルからSafariを起動します。
$ CA_COLOR_OPAQUE=1 /Applications/Safari.app/Contents/MacOS/Safari
代替方法:
$ export CA_COLOR_OPAQUE=1
$ /Applications/Safari.app/Contents/MacOS/Safari
どうやら、ハードウェアアクセラレーションレイヤーは赤に着色する必要があります。詳細 ここ および ここ 。
Safari 7.0.3で機能する別の方法を次に示します(クレジット David Calhoun ):
次に、要素のCSS遷移をトリガーします。色付きの境界線がある場合は、独自の合成レイヤーがあります。
詳細については、次の優れた記事をご覧ください。