質問: このサイトにはいつも大変お世話になっております。 以前より原因が分からなかったAnimationや、画像の激しい切り替え時にカクカクとコマ落ちしたようになってしまう原因について、xmlレイアウトについてImageViewを重ねていることが原因の様でした。 キャラクターの動きや移動の前に7枚ほどImageViewを配置していますが、1枚のみにすると非常にスムーズになります。 ただ、7枚あってもAndroid4.1ですと、動きは問題ないです。 (2機種でテスト済みでどちらも支障なし) android6.0ですと、カクカクしてまともに動きません。 (こちらも2機種で試して、どちらもまともに動かず) Android6.0でも、背面のImageViewを1枚のみすると問題ないです。 xmlのプログラムは下記になります。 何度もお手数をおかけいたしますが、ご教授のほど、よろしくお願いいたします。 ``` ``` 上記のImageViewのmap_i_1~6をgone又はinvisibleにすると軽快に動き、visibleにすると、まともに動きません。 kyaraは0.175秒毎に画像を入れ替えています。画像の大きさは400バイト程度しかありません。 map_i_1~6の画像はほとんど透過処理された画像で点ほどの大きさの画像があるのみです。 容量はどれも3.5kb程度の大きさです。 透過処理画像が、6枚も重ねているのが原因でしょうか? (でも、なんでAndroid4.1でスムーズに動くでのしょうか?) ※動きが遅いときは、Android StudioのCPUのモニターが20~30%になっています。 ImageView枚数を減らすと、2~7%程しかありません。 android4.1ですと、ImageView枚数に関係なく、CPUは2~7%程度です。 ※機種と使用メモリについて 1android4.1 htc j ISH13HT 解像度=960×540 使用メモリ=58MB位 xperia so-03E(タブレット) 解像度=1920x1200 使用メモリ=65MB位 2android6.0 Xperia x 解像度=1920x1080 使用メモリ=235MB DIGNO E 今は手元になし 以上、ご教授のほど、よろしくお願いいたします。
回答: 追記された情報を見たところ、恐らくはメモリ使用量の問題ですね。どの端末においてもかなり厳しい値ですが、Xperia xの値はどう見ても高すぎです。Androidでは、端末のメモリがどれだけ搭載されていても個別のアプリがそれをフルに使えるわけではありません。デバイスによって挙動が異なるのは、Androidのバージョン差ではなくて、端末のピクセル密度の差が影響しているのではないでしょうか。 drawableに画面密度毎に画像を入れていると思うのですが、Xperia xではその中の最大のものが使われることと、この個別のアプリが使える上限メモリの値が衝突しているように思います。実機をUSBで繋いだ状態でテストして、logcatを見てください。GC(ガベージコレクション)が頻繁に発生していませんか?。GCが発生すると、メモリ回収のためのプログラムが処理に割り込み、画面のカクツキの原因になります。 このGCが今回の原因だと仮定して、恐らく有効だと思われる対策をいくつか書いておきます。 1.使用する画像をあらかじめ合成しておく。つまり、重ね合わせた画像を必要なだけあらかじめ作っておいて、その1枚をJavaから動的にセットする(組み合わせパターン数が少ない場合)。または、使用タイミングに合わせてJavaコード中で画像を合成してその1枚を動的にセットする(組み合わせパターン数が多い場合)。恐らく、ImageViewはkyaraと背景の2つだけになります。動的な画像読み込み時にフルカラー(ARGB8888)ではなくRGB565に落とすのも有効です。 2.レイアウトを変更し、画像の透明部分を極力削除し、画像の縦横サイズを限界まで下げる。XMLのルートをFrameLayoutにして、各画像の位置はマージン等で調整する。 3.高解像度の端末でも低解像度の画像を使用する。つまり、xxhdpiなどのフォルダにもhdpiなどと同じ画像を入れる。ただし、ハイエンド機における見た目がちょっと悪くなる欠点がある。 使用メモリ量はAndroid4.1の端末で10~20MBぐらいを目標とすると良いでしょう。また、3.の手法は欠点もありますが、ある程度妥協しないといけない場合もあります。