2012-03-01 2 views
2

私のアプリでは、タッチイベントをキャプチャして処理することで、画面上に描画することができます。さらに、私のアプリケーションでは、Canvas.drawPictureやハードウェアアクセラレーションでサポートされていない他のメソッドを使用しています。Android:ハードウェアアクセラレーションに関する奇妙な問題?

一部のICSデバイスでは、強制的にハードウェアアクセラレーションを強制的に設定するオプションがあります。「gpuを強制的に実行し、アプリケーションに2dハーベスタを使用する」これを有効にすると、エラー:android.view.GLES20Canvas.drawPicture(GLES20Canvas.java:895)でアプリケーションがクラッシュします。したがって、このメソッドを使用するビューで、ハードウェアアクセラレーションを明示的に無効にしました。

ただし、この方法でハードウェアアクセラレーションを無効にすると、図面のパフォーマンスに影響を与え、描画が「Motionfeature.ACTION_MOVE生成されます。これは、「強制加速」設定がオンになっているかどうかに関係なく、3.0以上のすべてのデバイスで発生します。

私は図面のアシスタントであったビューのレイヤータイプに何かがあり、View.setLayerType(...)を呼び出すとこれが失われていることを示しています。 View.setLayerType(...)を呼び出す前に、View.getLayerType()はLAYER_TYPE_NONEを評価します。

ハードウェアアクセラレーションを明示的に防止する方法については、私のタッチ入力を支援していたものをそのまま残しておいてください。

+0

私は、このような提案を持っていないが、あなたは(http://code.google.com/p/android/issues/list)[バグとして報告この]かもしれませんが、文書化の方法はへのハードウェアアクセラレーションを回避すると、この副作用があります。 –

答えて

0

レイヤータイプをソフトウェアに設定すると、システムは基本的にビューをビットマップに描画しなければなりません。したがって、描画時に余分なオーバーヘッドが発生します。これはパフォーマンスの低下の原因となる可能性があります。 あなたのクラッシュは、ハードウェアアクセラレーションでサポートされていないキャンバスAPI呼び出しの使用によるものと思われます。次の呼び出しは、現在サポートされていません。

  • クリップ経路
  • clipRegion
  • drawPicture
  • drawPoints
  • drawPosText
  • drawTextOnPath
  • drawVertices

アルスoハードウェアアクセラレーションが有効な場合、アンチエイリアシングがサポートされていないため、描画する線がギザギザに見えることに注意してください。

だから、あなたがサポートされていないすべての呼び出しを削除し、ハードウェアアクセラレーションを使用するか、さらにyo​​ursoftwareレンダリングを最適化しようとするのいずれかに試みることができる:

  • あなたのドロー中にパスやビットマップなどのオブジェクトを作成しない
  • を呼び出します
  • キャッシュ
  • がRGB565(あなたは何のアルファを必要としない場合のみ)

    は、GetWindow()のsetFormat(PixelFormat.RGB_565)に、ウィンドウのピクセルフォーマットを設定するビットマップにあなたの写真。