Androidハードウェア加速のメリットとデメリット

3968 ワード

Androidでのハードウェアアクセラレータ
本文の主な内容はSDK文章の「Hardware Acceleration」から来ている.
Android 3.0から、Androidの2 Dレンダリングパイプラインはハードウェアアクセラレータをよりよくサポートします.ハードウェアアクセラレータはGPUを用いてView上の描画操作を行う.
ハードウェアアクセラレータは、次の4つのレベルでオンまたはオフにできます.
  • Application
  • Activity
  • Window
  • View

  • アプリケーションレベル
    アプリケーション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だけを使っているならば、安心して大胆にハードウェアの加速をオンにしましょう!具体的には、ハードウェアアクセラレータがサポートされていない図形描画操作はどれですか?ハードウェアアクセラレータがサポートされていないことが知られている図面操作を次に示します.
  • Canvas
  • clipPath()
  • clipRegion()
  • drawPicture()
  • drawPosText()
  • drawTextOnPath()
  • drawVertices()

  • Paint
  • setLinearText()
  • setMaskFilter()
  • setRasterizer()

  • また、ハードウェアアクセラレータをオンにするかオフにするかで、効果が異なります.
  • Canvas
  • clipRect(): XOR , Difference ReverseDifference ,3D 。
  • drawBitmapMesh():colors配列は無視される
  • drawLines():アンチエイリアシングは
  • をサポートしていません
  • setDrawFilter():設定できますが、効果はありません

  • Paint
  • setDither():無視
  • setFilterBitmap():フィルタは
  • を常にオンにします.
  • setShadowLayer():テキストでのみ使用可能
  • ComposeShader
  • ComposeShaderには、BitmapShaderとLinearGradientのような異なるタイプのshaderしか含まれません.ただし、BitmapShaderインスタンスは2つではありません.
  • ComposeShaderはComposeShader
  • を含めることはできません.
    アプリケーションがこれらの影響を受ける場合は、影響を受ける部分で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.表示リストの描画