OutOfMemoryとAndroid Studioでのベクター画像の使用

こんにちは、Habr! 初心者を対象としたこの記事では、アプリケーションによるデバイスのメモリの使用を最適化するためのヒントを提供し、絶えずOutOfMemoryを取得しないようにし、Android Studio(3.4)の現在のバージョンでのベクター画像の使用も検討します。トピック(ベクトル画像に関するHabréに関する最後の記事は2015年にさかのぼります)は時代遅れであり、多くの場合、初心者の開発者を誤解させます。 それでは始めましょう。



1.ビットマップの代わりにベクター画像を使用する



もちろん、多くの小さな詳細を含む大きな画像はベクトルに変換すべきではありません。これは、ラスタではなくても、ラスタと同じくらいのスペースを占有します。 ただし、アイコンやユーザーインターフェイスの他の詳細などの小さな画像は、メモリを節約するためにベクトルに変換する必要があります。 多くの場合、 ベクター画像の操作ははるかに便利です。 そして今、最も重要なこと-それを行う方法?



  1. Android Studioを開きます。
  2. 描画可能フォルダーまたはそのコンテンツを右クリック>新規>ベクター資産



  3. svgファイルへのパスを指定します。 画像の形状が不規則な場合は、[オーバーライド]パラメーターの横にあるボックスをオンにすることをお勧めします。そうしないと、画像が標準サイズに調整され、比率が歪む可能性があります。



  4. 次へ>終了
  5. できた!


ラスターからベクターに変換するには、優れた無料のInkscapeアプリケーションをお勧めします。 彼との仕事について少し:



  1. Inkscapeを開きます。
  2. そこにラスターをドラッグします。 開いたウィンドウで、インポートオプションを選択し、[OK]をクリックします。
  3. 上部のツールバーで、画像を選択した後、パス>ラスターのベクトル化(Shift + Alt + B)を選択します。
  4. 今最も重要なこと。 新しいウィンドウで、「背景の削除」の横にあるチェックボックスをオンにして、画像をカラーにするかどうか、スキャンの回数を選択します。 ベクターファイルのサイズがこれら2つのパラメーターに直接依存することを忘れないでください。



    より多くのスキャン-より多くの色、色合い、詳細。 私のレプラコーンは、神聖な外観を得るために、画像の色数が多いため、30回のスキャンが必要でした。 これは非常に多く、10を超えないようにして写真を簡単に選択することをお勧めします。



  5. ウィンドウを閉じ、ラスターをクリックしてDeleteキーで削除し、ファイル>ドキュメントプロパティ(Shift + Ctrl + D)に移動して、コンテンツのページサイズを調整します。


ここで、メモリの節約におけるベクターの利点を証明する小さなテストを実行します。

単一のImageViewを使用して新しいプロジェクトを作成し、これにポイントAからポイントBに移動するアニメーションを適用し、画像をラスターとベクトルに交互に変更しました。 データを確認します。



ラスター







ベクトル







違いはほぼ2倍です。 これは非常に説得力があると思います。



2.ヒープサイズを増やす



これを行うには、プロジェクトのマニフェスト(app> manifests> AndroidManifest.xml)に移動し、アプリケーション列に次の行を追加します。



android:largeHeap="true"
      
      





実際、ヒープを増やすことはOutOfMemoryの問題の解決策ではなく、むしろそれを遠い棚に押し出すことです。 アプリケーションのデバイスのメモリ使用を最適化する代わりに、より多くのスペースを提供します。 各デバイスには、アプリケーション用に割り当てられた、プライマリとセカンダリの両方の独自のメモリ容量があることを忘れないでください。



3.メモリリークを回避する



作業中のアプリケーションは多くのオブジェクトを使用しますが、もちろんそれらはメモリ内の特定の場所を占有します。 理想的には、ガベージコレクターは未使用のオブジェクトを削除する必要がありますが、アプリケーションで深刻な問題を引き起こすいわゆる「メモリリーク」が発生する場合があります。 メモリリークにはさまざまな原因があります 。詳細については、 ここで説明します



私自身は、Badooによって開発され、android.os.Handlerの誤用に関連するメモリリークを排除するように設計されたWeakHandlerライブラリーに助言したいと思います。 このライブラリを使用するには、gradleファイルの依存関係列に次の行を追加します(Gradle Scripts> build.gradle(Module:app)):



 compile 'com.badoo.mobile:android-weak-handler:1.1'
      
      





そして、Javaファイルで:



 private WeakHandler mHandler; protected void onCreate(Bundle savedInstanceState) { mHandler = new WeakHandler(); ... } private void onClick(View view) { mHandler.postDelayed(new Runnable() { view.setVisibility(View.INVISIBLE); }, 5000); }
      
      





スタジオがこれを自動的に行わなかった場合は、WeakHandler自体をインポートすることを忘れないでください。



4.大きなタイムラプスアニメーションを避ける



Android Studioのフレーム単位のアニメーションは便利ですが、最も経済的なものではありません。 多数の画像を使用すると、OutOfMemoryが確実に得られます。



しかし、本当に必要な場合は、 Android Gif Drawableライブラリとともにgif画像を使用することをお勧めします。 このライブラリは、gifの処理を簡素化し、Android Studioのフレーム単位のアニメーションよりもはるかに少ないメモリを消費します。 このライブラリを使用するには、gradleファイルの依存関係列に次の行を追加します(Gradle Scripts> build.gradle(Module:app)):



 implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
      
      





2番目のgradleファイル(Gradle Scripts> build.gradle(モジュール:「アプリケーション名」))でbuildscriptおよびallproject列に次の行を追加します。



 mavenCentral()
      
      





そして、Javaファイルで:



 GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start();
      
      





gifを無効にするには、start()の代わりにstop()を書きます。 また、gifを圧縮することを忘れないでください、これはさらに多くのスペースを節約します。



私の記事がお役に立てば幸いです。 ありがとう



All Articles