Androidハードウェア加速のメリットとデメリット
3968 ワード
Androidでのハードウェアアクセラレータ
本文の主な内容はSDK文章の「Hardware Acceleration」から来ている.
Android 3.0から、Androidの2 Dレンダリングパイプラインはハードウェアアクセラレータをよりよくサポートします.ハードウェアアクセラレータはGPUを用いてView上の描画操作を行う.
ハードウェアアクセラレータは、次の4つのレベルでオンまたはオフにできます. Application Activity Window View
アプリケーションレベル
アプリケーションAndroidManifestへxmlファイルはアプリケーションラベルに次のプロパティを追加して、アプリケーション全体にハードウェアアクセラレータをオンにします.
Activityレベル
また、各activityがハードウェアアクセラレータをオンにするかどうかを制御するには、activity要素にandroid:hardwareAcceleratedプロパティを追加するだけで実行できます.例えば、次の例では、アプリケーションレベルでハードウェアアクセラレータをオンにしますが、あるactivityでハードウェアアクセラレータをオフにします.
Windowレベル
より小さな粒度の制御が必要な場合は、次のコードを使用してwindowのハードウェアアクセラレータをオンにします.
注意:Windowsレベルでハードウェアアクセラレータをオフにすることはできません.
Viewレベル
実行時に次のコードで単一viewのハードウェアアクセラレータを閉じることができます.
注意:viewレベルでハードウェアアクセラレータをオンにすることはできません
なぜこんなに多くのレベルの制御が必要なのですか?
明らかに、ハードウェアの加速は性能の向上をもたらすことができて、androidはどうしてこんなに多くのレベルの制御をして、デフォルトですべてのハードウェアの加速ではありませんか?なぜなら、すべての2 Dグラフィックス操作がハードウェアアクセラレータをサポートしているわけではありません.プログラムでカスタムビューまたはグラフィックス呼び出しを使用している場合、プログラムが正常に動作しない可能性があります.もしあなたのプログラムの中で標準的なビューとDrawableだけを使っているならば、安心して大胆にハードウェアの加速をオンにしましょう!具体的には、ハードウェアアクセラレータがサポートされていない図形描画操作はどれですか?ハードウェアアクセラレータがサポートされていないことが知られている図面操作を次に示します. Canvas clipPath() clipRegion() drawPicture() drawPosText() drawTextOnPath() drawVertices()
Paint setLinearText() setMaskFilter() setRasterizer()
また、ハードウェアアクセラレータをオンにするかオフにするかで、効果が異なります. Canvas clipRect(): drawBitmapMesh():colors配列は無視される drawLines():アンチエイリアシングは をサポートしていません setDrawFilter():設定できますが、効果はありません
Paint setDither():無視 setFilterBitmap():フィルタは を常にオンにします. setShadowLayer():テキストでのみ使用可能 ComposeShader ComposeShaderには、BitmapShaderとLinearGradientのような異なるタイプのshaderしか含まれません.ただし、BitmapShaderインスタンスは2つではありません. ComposeShaderはComposeShader を含めることはできません.
アプリケーションがこれらの影響を受ける場合は、影響を受ける部分で
Androidの描画モデル
ハードウェアアクセラレータをオンにすると、Androidフレームワークに新しいペイントモデルが採用されます.ソフトウェアベースのペイントモデルとハードウェアベースのペイントモデルは違いますか?
ソフトウェアベースのペイントモデル
ソフトウェアペイントモデルの下で、ビューは次の2つの手順で描画されます.
1.Invalidate the hierarchy(注:hierarchyはどのように翻訳しますか?)
2. Draw the hierarchy
アプリケーションはinvalidate()を呼び出してUIの一部を更新し、失効(invalidation)メッセージはビューレイヤ全体に渡され、再描画が必要な領域(すなわち汚れた領域)ごとに計算されます.Androidシステムは、汚れた領域と交差するすべてのviewを再描画します.明らかに、この描画モードには欠点があります.
1.各ペイント操作で不要なコードが実行されます.たとえば、アプリケーションがinvalidate()を呼び出してbuttonを再描画し、buttonが別のviewの上にある場合、そのviewが変化しなくても再描画されます.
2.アプリケーションのバグを隠す可能性があります.Androidシステムでは、汚れた領域と交差するviewが再描画されるため、viewの内容はinvalidate()を呼び出さずに再描画される可能性があります.これは、1つのviewが他のviewに依存して失効して正しい動作を得る可能性がある.
ハードウェアベースのペイントモデル
Androidシステムはinvalidate()とdraw()を使用してviewを描画していますが、処理ペイントでは異なります.Androidシステムは、すぐにペイントコマンドを実行するのではなく、ペイントコマンドを表示リストに記録します.もう1つの最適化は、Androidシステムが汚い(invalidate()とマークされたviewを記録し、更新するだけです.新しいドラフトモデルには、次の3つのステップがあります.
1. Invalidate the hierarchy
2.表示リストの記録と更新
3.表示リストの描画
本文の主な内容はSDK文章の「Hardware Acceleration」から来ている.
Android 3.0から、Androidの2 Dレンダリングパイプラインはハードウェアアクセラレータをよりよくサポートします.ハードウェアアクセラレータはGPUを用いてView上の描画操作を行う.
ハードウェアアクセラレータは、次の4つのレベルでオンまたはオフにできます.
アプリケーションレベル
アプリケーションAndroidManifestへxmlファイルはアプリケーションラベルに次のプロパティを追加して、アプリケーション全体にハードウェアアクセラレータをオンにします.
<application android:hardwareAccelerated="true" ...>
Activityレベル
また、各activityがハードウェアアクセラレータをオンにするかどうかを制御するには、activity要素にandroid:hardwareAcceleratedプロパティを追加するだけで実行できます.例えば、次の例では、アプリケーションレベルでハードウェアアクセラレータをオンにしますが、あるactivityでハードウェアアクセラレータをオフにします.
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
Windowレベル
より小さな粒度の制御が必要な場合は、次のコードを使用してwindowのハードウェアアクセラレータをオンにします.
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:Windowsレベルでハードウェアアクセラレータをオフにすることはできません.
Viewレベル
実行時に次のコードで単一viewのハードウェアアクセラレータを閉じることができます.
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
注意:viewレベルでハードウェアアクセラレータをオンにすることはできません
なぜこんなに多くのレベルの制御が必要なのですか?
明らかに、ハードウェアの加速は性能の向上をもたらすことができて、androidはどうしてこんなに多くのレベルの制御をして、デフォルトですべてのハードウェアの加速ではありませんか?なぜなら、すべての2 Dグラフィックス操作がハードウェアアクセラレータをサポートしているわけではありません.プログラムでカスタムビューまたはグラフィックス呼び出しを使用している場合、プログラムが正常に動作しない可能性があります.もしあなたのプログラムの中で標準的なビューとDrawableだけを使っているならば、安心して大胆にハードウェアの加速をオンにしましょう!具体的には、ハードウェアアクセラレータがサポートされていない図形描画操作はどれですか?ハードウェアアクセラレータがサポートされていないことが知られている図面操作を次に示します.
また、ハードウェアアクセラレータをオンにするかオフにするかで、効果が異なります.
XOR
, Difference ReverseDifference ,3D 。
アプリケーションがこれらの影響を受ける場合は、影響を受ける部分で
setLayerType(View.LAYER_TYPE_SOFTWARE, null),
を呼び出すことができます.Androidの描画モデル
ハードウェアアクセラレータをオンにすると、Androidフレームワークに新しいペイントモデルが採用されます.ソフトウェアベースのペイントモデルとハードウェアベースのペイントモデルは違いますか?
ソフトウェアベースのペイントモデル
ソフトウェアペイントモデルの下で、ビューは次の2つの手順で描画されます.
1.Invalidate the hierarchy(注:hierarchyはどのように翻訳しますか?)
2. Draw the hierarchy
アプリケーションはinvalidate()を呼び出してUIの一部を更新し、失効(invalidation)メッセージはビューレイヤ全体に渡され、再描画が必要な領域(すなわち汚れた領域)ごとに計算されます.Androidシステムは、汚れた領域と交差するすべてのviewを再描画します.明らかに、この描画モードには欠点があります.
1.各ペイント操作で不要なコードが実行されます.たとえば、アプリケーションがinvalidate()を呼び出してbuttonを再描画し、buttonが別のviewの上にある場合、そのviewが変化しなくても再描画されます.
2.アプリケーションのバグを隠す可能性があります.Androidシステムでは、汚れた領域と交差するviewが再描画されるため、viewの内容はinvalidate()を呼び出さずに再描画される可能性があります.これは、1つのviewが他のviewに依存して失効して正しい動作を得る可能性がある.
ハードウェアベースのペイントモデル
Androidシステムはinvalidate()とdraw()を使用してviewを描画していますが、処理ペイントでは異なります.Androidシステムは、すぐにペイントコマンドを実行するのではなく、ペイントコマンドを表示リストに記録します.もう1つの最適化は、Androidシステムが汚い(invalidate()とマークされたviewを記録し、更新するだけです.新しいドラフトモデルには、次の3つのステップがあります.
1. Invalidate the hierarchy
2.表示リストの記録と更新
3.表示リストの描画