7

Android.view.GLES20DisplayListからビットマップを解放する方法を知っている人はいますか? そして、たとえば ImageView を手動でクリーニングしても、なぜそれらが生き続けるのでしょうか? あるいは、GLES20DisplayList を無効にする方法があり、AndroidManifest で android:hardwareAccelerated="false" を使用しようとしましたが、まだ運がありません。

4.2(1) でのみ影響を受けるようです

更新: 4.2.1 でハードウェア アクセラレーションを無効にできないようです (バグ?)

簡単なテスト:

Android manifest:
application ... android:hardwareAccelerated="false"

System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated());
mListView.setLayerType(LAYER_TYPE_SOFTWARE, null);
System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated());

結果:

12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true
12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true
4

2 に答える 2

3

これは 4.2 でのメモリ リークのようです。この修正はそれに対して意図されているようです: https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0

この問題が発生したアクティビティの 4.2 のマニフェストでハードウェア アクセラレーションを無効にしました。これにより、android.view.GLES20DisplayList のメモリ保持が改善されました。

アクティビティのマニフェスト: android:hardwareAccelerated="@bool/gpu_enabled"

v17 の values.xml では:

<bool name="gpu_enabled">false</bool>   

default values.xml では true に設定しています。

于 2013-01-10T12:45:42.437 に答える
1

最近、この問題に関して詳細なメモリ分析を行いました。上で Yulia が指摘したように、ハードウェア アクセラレーションを無効にすると、一般的にうまくいくでしょう。または、指摘したように、ImageView の Drawable を null に設定したり、ビットマップをリサイクルしたり、ImageView をデタッチしたりできます。

ただし、API のバージョンによって、GLES20DisplayList からビットマップメモリ​​が解放される場合と解放されない場合があります。これらのさまざまな動作と考えられる解決策については、私のブログ投稿 Android Bitmap Memory Analysisで詳しく説明しましたが、簡単な解決策は、ハードウェア アクセラレーションを無効にすることです。

于 2014-03-10T05:59:11.173 に答える