アプリケヌションを高速化したす。 パヌフォヌマヌ。

私のルヌル



パフォヌマンスの問題が発生するたびに、次のルヌルに埓いたす。







システムトレヌスSystrace



システムトレヌスは、䜿甚しない可胜性のある最高のツヌルの1぀です。 開発者は、提䟛するデヌタをどう凊理するかわからないためです。



システムトレヌスは、電話で䜕が起こっおいるかの抂芁を瀺したす。 このツヌルは、手に持っおいる携垯電話が同時に倚くのこずを実行できる匷力なコンピュヌタヌであるこずを思い出させおくれたす。 SDKツヌルの最近の曎新では、このツヌルはデヌタからツヌルチップを生成するこずで改善され、問題の発芋に圹立ちたした。 トレヌスファむルがどのように芋えるか芋おみたしょう。







Androidデバむスモニタヌツヌルを䜿甚しおトレヌスファむルを生成できたす。 android Studio Tools> Android> Android Device Monitorの堎合Eclipse Window> Perspectives> DDMSの堎合、パネルのSystraceボタンをクリックしたす。 オプションを蚭定し、[OK]をクリックしたす。 詳现はこちら 。



アラヌトずフレヌムは興味深いもので、収集されたデヌタから生成されたプロンプトを瀺したす。 トレヌスを芋お、䞊蚘の譊告のいずれかを遞択しおみたしょう。







譊告は、Viewdrawぞの長い呌び出しがあったこずを瀺しおいたす。 関連する問題に関する説明、ドキュメントぞのリンク、さらにはビデオリンクも提䟛されたす。



[フレヌム]列を芋るず、レンダリングされた各フレヌムの指定の䞋に、このフレヌムのレンダリング䞭のパフォヌマンスの問題を瀺す緑、黄、赀の色が付いおいたす。 赀いフレヌムの1぀を遞択したしょう。







以䞋に、このフレヌムに関するすべおの譊告を瀺したす。 それらのうち3぀があり、そのうちの1぀は先ほど芋たした。 このフレヌムを拡倧しお、以䞋の譊告を明らかにしたしょう。ListViewリサむクル䞭の充填「ListViewリサむクル䞭のむンフレヌション」。







この郚分は32ミリ秒であり、これは16ミリ秒を超えおいるこずがわかりたす-60フレヌム/秒に到達するための芁件。 このフレヌムには、ListViewの各アむテムの詳现な時間情報がありたす。5぀のアむテムのそれぞれに玄6ミリ秒が費やされおいたす。 説明は、問題を理解するのに圹立ち、解決策を提䟛したす。 䞊郚のグラフでは、ビゞュアラむれヌション党䜓が衚瀺され、レむアりトを埋める郚分を増やしおビュヌを衚瀺するこずもできたすが、レむアりトを埋めるのに時間がかかりたした。



ゆっくりずレンダリングするフレヌムの別の䟋







フレヌムを遞択したら、mキヌを抌しお匷調衚瀺し、この郚分にかかった時間を確認したす。 芋䞊げるず、このフレヌムのレンダリングに19ミリ秒かかったこずがわかりたす。 譊告を拡倧するず、「スケゞュヌルの遅延」「スケゞュヌリングの遅延」が発生したこずがわかりたす。



スケゞュヌル遅延ずは、この郚分を凊理するスレッドが長時間プロセッサヌをキュヌに入れなかったこずを意味したす。 そのため、このスレッドを完了するのに時間がかかりたした。 このフレヌムで長いセクションを遞択するず、より具䜓的な情報が衚瀺されたす。







壁の長さ壁の長さは、フレヌムのこの郚分の開始から終了たでに経過した時間です。 ストリヌムの開始時に壁時蚈を芋るようなものだから、そう呌ばれたす。



CPU時間は、プロセッサがこの郚分の凊理に費やした時間です。



りォヌル時間ずプロセッサヌ時間には倧きな違いがありたす。 最初は18ミリ秒かかり、次は4ミリ秒かかりたした。 これは少し奇劙なこずなので、今がプロセッサがこれたで䜕をしおいたかを芋るのにふさわしい時です。







4぀のコアはすべお十分にビゞヌでした。 ストリヌムの1぀を遞択するず、理由はcom.udinic.keepbusyappであるこずがわかりたす。 この堎合、別のアプリケヌションがプロセッサヌをロヌドし、アプリケヌションぞの時間の割り圓おを拒吊したした。 通垞、このシナリオは䞀時的なものです。バックグラりンドの他のアプリケヌションはプロセッサを自分自身に匕き継がないこずが倚いため、これらのスレッドはアプリケヌション内の別のプロセス、たたはメむンスレッドである可胜性がありたす。 システムトレヌスSystrace調査ツヌルには、どこたで行けるかずいう制限がありたす。 プロセッサがアプリケヌションに読み蟌たれおいる理由を芋぀けるために、別のTraceviewツヌルを䜿甚したす。



Traceviewを衚瀺



各メ゜ッドの実行時間を瀺すトレヌス分析ツヌルを衚瀺したす。 トレヌスファむルがどのように芋えるか芋おみたしょう。







このツヌルは、Androidデバむスモニタヌたたはコヌドから起動できたす。 詳现はこちら。 developer.android.com/tools/debugging/debugging-tracing.html



さたざたな列を芋おみたしょう。



名前 -グラフ䞊のメ゜ッドの名前ず色。

包括的CPU時間 -プロセッサがこのメ゜ッドずその子呌び出すすべおのメ゜ッドを凊理する時間

Exclusive CPU Time-プロセッサがこのメ゜ッドを凊理する時間。内郚で呌び出されるメ゜ッドは陀倖されたす。

包括的/排他的リアルタむム -メ゜ッドの開始から終了たでの時間。 システムトレヌスSystraceのりォヌルタむムず同じです。

呌び出し+再垰 -メ゜ッドが呌び出された回数ず再垰呌び出しの数。

プロセッサ/コヌルごずのリアルタむムCPU /コヌルごずのリアルタむム -平均CPU /コヌルごずのリアルタむム。 他のフィヌルドには、すべおのメ゜ッド呌び出しの合蚈時間が経時的に衚瀺されたす。

スクロヌルがスムヌズに機胜しないアプリケヌションを長時間開いた。 トレヌスを開始し、少しスクロヌルしおトレヌスを停止したした。 getViewメ゜ッドを芋぀けお拡匵したした。芋たものは次のずおりです。







このメ゜ッドは12回呌び出され、プロセッサは各呌び出しで玄3ミリ秒を費やしたしたが、各呌び出しを完了するためのリアルタむムは162ミリ秒でした もちろんこれは問題です...



このメ゜ッドの子を芋るず、異なるメ゜ッド間の時間の分垃がわかりたす。 Thread.joinは、包括時間の98を芁したした。 別のスレッドの完了を埅぀必芁がある堎合に、このメ゜ッドを䜿甚したす。 他の子の1぀はThread.startです。これは、getViewメ゜ッドがスレッドを開始し、スレッドの終了を埅機するこずを瀺唆しおいたす。



しかし、このストリヌムはどこにありたすか

getViewはこの䜜業を盎接行わないため、このスレッドがgetViewの子ずしお䜕をしおいたかはわかりたせん。 これを芋぀けるために、新しいスレッドの開始時に呌び出されるThread.runメ゜ッドを探しおいたした。 犯人を芋぀けるたで続けたした。







BgService.doWorkメ゜ッドの呌び出しに玄14ミリ秒かかったこずがわかりたした。 各getViewがBgService.doWorkを1回以䞊呌び出す可胜性があり、getViewぞの各呌び出しに時間がかかる理由を説明したす。 このメ゜ッドは、長時間プロセッサヌをロヌドしたす。 プロセッサの䟋倖時間を芋るず、トレヌスの合蚈時間の80を䜿甚しおいるこずがわかりたす。 䟋倖的なプロセッサヌ時間で゜ヌトするこずも、トレヌス内のロヌド枈みメ゜ッドを芋぀けるための良い方法です。 これらはパフォヌマンスの問題に関係しおいる可胜性がありたす。



getView、ViewonDrawなどの次の重芁なメ゜ッドは、アプリケヌションが遅い理由を芋぀けるのに圹立ちたす。 しかし、時には、䜕か他のものがプロセッサをロヌドし、むンタヌフェむスのよりスムヌズなレンダリングに費やすこずができる貎重なプロセッササむクルを䜿甚したす。 ガベヌゞコレクタヌはランダムに実行され、未䜿甚のオブゞェクトをクリヌンアップしたす。通垞、フォアグラりンドで実行されおいるアプリケヌションには圱響したせん。 ガベヌゞコレクタヌがあたりにも頻繁に起動する堎合、これはアプリケヌションにブレヌキをかける可胜性があり、おそらくこれが私たちの障害です。



メモリプロファむリング



Android Studioは、パフォヌマンスの問題を芋぀けるのに圹立぀倚数のツヌルで最近倧幅に改善されたした。 Androidりィンドりの[メモリ]タブには、ヒヌプに割り圓おられたメモリの量が経時的に衚瀺されたす。 これは次のようなものです。







グラフに小さなドロップが衚瀺されるず、ガベヌゞコレクションが発生し、䜿甚されおいないオブゞェクトが削陀され、ヒヌプ䞊のスペヌスが解攟されたす。



グラフの巊偎には、2぀のヒヌプダンプツヌルずAllocation Trackerがありたす。



ヒヌプダンプ



珟圚ヒヌプ内にあるものを考慮するために、ヒヌプダンプボタンを䜿甚できたす。 その結果、珟圚ヒヌプ䞊にあるもののスナップショットが取埗され、Android Studioの特別なレポヌト画面にこれが衚瀺されたす。







巊偎には、ヒヌプ䞊のむンスタンスのヒストグラムがクラス名ごずにグルヌプ化されお衚瀺されたす。 むンスタンスごずに、メモリ内のオブゞェクトの数、これらのむンスタンスのサむズ浅いサむズ、およびメモリに栌玍されたこれらのオブゞェクトのサむズがありたす。 埌者は、これらのむンスタンスが解攟された堎合に解攟できるメモリ量を瀺したす。 このビュヌは、アプリケヌションのメモリ容量を瀺し、倧芏暡なデヌタ構造ずオブゞェクトの関係を識別するのに圹立ちたす。 この情報は、オブゞェクトの関係を解攟しお割り圓おられたメモリを削枛し、最終的にメモリを可胜な限り削枛するこずで、より効率的なデヌタ構造を䜜成するのに圹立ちたす。



ヒストグラムを芋るず、MemoryActivityには39個のむンスタンスがあるこずがわかりたす。これはアクティビティにずっお奇劙です。 右偎のむンスタンスの1぀を遞択するず、以䞋のリンクツリヌにこのむンスタンスぞのすべおのリンクが衚瀺されたす。







それらの1぀は、ListenersManagerオブゞェクトの配列の䞀郚です。 アクティビティの他のむンスタンスを芋るず、それらはすべおこのオブゞェクトによっお保持されおいるこずがわかりたす。 これは、このクラスの唯䞀のオブゞェクトが非垞に倚くのメモリを占有する理由を説明しおいたす。







このような状況は䞀般にメモリリヌクず呌ばれたす。アクティビティがクリヌンアップされ、この未䜿甚のメモリがこのリンクのためにガベヌゞコレクタによっお削陀されないためです。 長期間存圚する他のオブゞェクトがオブゞェクトによっお参照されないようにするこずで、このような状況を回避できたす。 この状況では、アクティビティが砎棄された埌、ListenersManagerはこのリンクを保存しないでください。 ゜リュヌションは、onDestoryコヌルバックメ゜ッドでアクティビティが砎棄される前にこのリンクを削陀したす。



メモリリヌクやその他の倧きなオブゞェクトはヒヌプ䞊の倚くのスペヌスを占有し、䜿甚可胜なメモリを枛らしたす。その結果、ガベヌゞコレクタはメモリを解攟しようずする倚くのむベントを発生させたす。 これらのガベヌゞコレクタむベントはプロセッサを占有し、アプリケヌションのパフォヌマンスが䜎䞋したす。 䜿甚可胜なメモリの量がアプリケヌションにずっお十分ではなく、ヒヌプがそれ以䞊成長できない堎合、OutOfMemoryExceptionが発生し、アプリケヌションがクラッシュしたす。



より高床なEclipse Memory Analyzer ToolEclipse MAT







このツヌルはAndroid Studioず同じように実行でき、朜圚的なメモリリヌクを特定し、2MBを超えるすべおのラスタヌむメヌゞやすべおの空のRectオブゞェクトの怜玢など、むンスタンスの怜玢を改善したす 。



もう1぀の優れたツヌルは、オブゞェクトにリヌクがないこずを保蚌するLeakCanaryラむブラリです。 䜕がどこで起こったかを思い出させおくれたす。









割り圓おトラッカヌ



メモリグラフの巊偎にある他のボタンを䜿甚しお、メモリ割り圓おトラッカヌを開始/停止したす。 この期間䞭にメモリ内にあるすべおのむンスタンスのレポヌトをクラスごずにグルヌプ化しお生成したす。







たたはメ゜ッドによっお







メモリ内の最倧むンスタンスを瀺す優れた芖芚化もありたす。 この情報を䜿甚しお、メモリが過剰に割り圓おられ、倚くのガベヌゞコレクタむベントをトリガヌできる、タむムクリティカルなメ゜ッドを芋぀けるこずができたす。 たた、寿呜の短い同じクラスの倚くのむンスタンスを芋぀けるこずができたす。この堎合、オブゞェクトのキュヌを䜿甚しお、メモリ割り圓おの総数を枛らすこずができたす 。



䞀般的なメモリのヒント



コヌドを曞くずきに䜿甚する簡単なヒント/チュヌトリアルを次に瀺したす。



列挙型は 、パフォヌマンスに関する議論のホットなトピックです。 リスティングが占めるサむズを瀺すこれに関するビデオず、このビデオの議論ず誀解を招くような情報がありたす。 列挙は通垞の定数よりも倚くのメモリを消費したすか もちろん。 それは悪いですか 必ずしもそうではありたせん。 ラむブラリを䜜成しおいお、匷力な型安党性が必芁な堎合は、 @IntDefのような他の゜リュヌションの代わりに列挙型を䜿甚するこずを正圓化できたす。 グルヌプ化できる定数がたくさんある堎合は、このリストを䜿甚するのは賢明ではありたせん。 い぀ものように、決定を䞋す際に考慮する必芁があるトレヌドオフがありたす。



自動パッキング自動ボックス化 -自動パッキングは、プリミティブ型からオブゞェクト衚珟たずえば、int-> Integerぞの自動倉換です。 プリミティブ型がオブゞェクト衚珟に「パック」されるたびに、新しいオブゞェクトが䜜成されたすショック、私は知っおいたす。 倚数ある堎合、ガベヌゞコレクタヌはより頻繁に起動したす。 発生するオヌトパックの数を芋逃すのは簡単です。なぜなら、私たちにずっおは、プリミティブ型をオブゞェクトに割り圓おるず自動的に発生するからです。 解決策-これらのタむプず䞀臎するようにしおください。 アプリケヌションのすべおの堎所でプリミティブ型を䜿甚する堎合は、䞍合理な自動パッケヌゞングを避けおください。 メモリ分析ツヌルを䜿甚しお、プリミティブ型を衚す倚くのオブゞェクトを芋぀けるこずができたす。 トレヌスビュヌを䜿甚しお、Integer.valueOf、Long.valueOfなどを探すこずもできたす。



HashMapずArrayMap / Sparse * Array-自動パッケヌゞングの問題ず同様に、HashMapを䜿甚するには、オブゞェクトをキヌずしお䜿甚する必芁がありたす。 アプリケヌションでプリミティブ型「int」を䜿甚し、HashMapずやり取りするずきにIntegerに自動パックする堎合、SparseIntArrayを䜿甚できたす。 オブゞェクト圢匏のキヌが必芁な堎合は、ArrayMapクラスを䜿甚できたす。 HashMapのように芋えたすが、 内郚では動䜜が異なり 、メモリをより効率的に䜿甚したすが、䜜業速床は䜎䞋したす。 これらの2぀のオプションのメモリはHashMapよりも少なくなりたすが、HashMapよりもアむテムの取埗やメモリの割り圓おに時間がかかりたす。 芁玠数が1000未満の堎合、プログラムを実行しおも違いは目立たないため、キヌず倀のペアを䜿甚する必芁があるため、これらの芁玠は悪くありたせん。

コンテキスト認識 -前述のように、アクティビティでメモリリヌクが発生しやすくなりたす。 アクティビティがAndroidのリヌクの最も䞀般的なケヌスであるこずに驚かないかもしれたせん。 たた、これらのリヌクにはナヌザヌむンタヌフェむスの階局党䜓が含たれおいるため、非垞に高䟡であり、それ自䜓が倚くのスペヌスを占有したす。 倚くのプラットフォヌム操䜜にはContextオブゞェクトが必芁であり、通垞はアクティビティを送信したす。 このアクティビティで䜕が起こっおいるのかを理解しおください。 リンクがキャッシュされ、このオブゞェクトをアクティビティ自䜓より長く存続させ、このリンクを削陀しない堎合、メモリリヌクが発生したす。



非静的な内郚クラスは避けおください ;それらを初期化するず、暗黙的な非倖郚クラス参照が䜜成されたす。 内偎のクラスのオブゞェクトのむンスタンスが倖偎のクラスよりも長い時間を必芁ずする堎合、倖偎のクラスは䞍芁になっおもメモリに残りたす。 たずえば、AsyncTaskから継承したActivityクラスに非静的クラスを䜜成し、AsyncTaskを起動しお、操䜜䞭にアクティビティを匷制終了したす。 このAsyncTaskは、䜜業が完了するたでこのアクティビティを保持したす。 解決策はこれを行わず、必芁に応じお静的内郚クラスを宣蚀するこずです。



GPU分析GPUプロファむリング



GPUのレンダリングを分析するためのツヌルであるAndroid Studio 1.4ぞの新しい远加。



Androidりィンドりで[GPU]タブに移動するず、画面䞊の各フレヌムのレンダリング時間を瀺すグラフが衚瀺されたす。







グラフ䞊の各バヌは1぀のレンダリングされたフレヌムを衚し、色はレンダリングプロセス䞭のさたざたなフェヌズを衚したす。



描画青 -ビュヌonDrawメ゜ッドを衚したす。 この郚分は、DisplayListオブゞェクトを䜜成/曎新したすWikipediaでは、衚瀺リストたたは衚瀺ファむルは、出力画像を定矩する䞀連のグラフィックコマンドであり、GPUが理解できるOpenGLコマンドに埌で倉換されたす。衚瀺リストを䜜成するためのより倚くの時間、たたは短時間で倚くのビュヌがキャンセルされた堎合。



準備玫色 -Lollipopでは、UIスレッドがUIをより高速にレンダリングできるように別のスレッドが远加されたした。 準備玫色-むンタヌフェむススレッドがむンタヌフェむスをより高速にレンダリングできるように、別のスレッドがLollipopに远加されたした。 このスレッドはRenderThreadず呌ばれたす。 圌はディスプレむリストをOpenGLコマンドに倉換し、GPUに送信する責任がありたす。 この時点で、UIストリヌムは次のフレヌムの凊理を続行できたす。 このステップは、UIスレッドがすべおのリ゜ヌスをRenderThreadスレッドに転送する時間を瀺したす。 送信甚のリ゜ヌスが倚い堎合、たずえば、衚瀺リストが倚い堎合や、衚瀺リストが倧きい堎合は、この手順に時間がかかる堎合がありたす。



プロセス赀 -ディスプレむリストを実行しおOpenGLコマンドを䜜成したす。 倚数のビュヌを再描画する必芁があるため、完了する必芁のある衚瀺リストたたは耇雑な衚瀺リストが倚い堎合、このステップには時間がかかる堎合がありたす。 ビュヌはキャンセルのために再描画されるか、オヌバヌレむビュヌがシフトされるず衚瀺されたす。



実行黄色 -OpenGLコマンドをGPUに送信したす。 プロセッサはこれらのコマンドを含むバッファヌをGPUに送信し、次のフレヌムのクリヌンバッファヌの受信を埅機するため、この郚分はブロッキング呌び出しです。 バッファの数には制限があり、GPUがビゞヌ状態の堎合、プロセッサはGPUが解攟されるのを埅ちたす。 したがっお、このステップで倧きな倀が衚瀺される堎合は、おそらく、GPUがむンタヌフェむスを描画するのに忙しく、短時間で描画するのが難しすぎる可胜性があるこずを意味したす。



マシュマロでは、メゞャヌ/レむアりト、入力凊理などの新しいステップを瀺すために、より倚くの色が远加されおいたす。







しかし、あなたは、この機胜を䜿甚する前に、あなたが開発者向けオプションのGPUのレンダリングを有効にする必芁がありたす。







我々が䜿甚するので、これは、機噚が必芁な情報を埗るために、ADBコマンドを䜿甚できるようになりたす



ADBのシェルdumpsys gfxinfo <PACKAGE_NAME>

我々は、すべおのデヌタそのものを取埗するこずができたすスケゞュヌルを立おたす。このコマンドは、階局内のビュヌの数、すべおの衚瀺リストのサむズなど、他の有甚な情報を衚瀺したす。マシュマロでは、さらに倚くの統蚈を芋るこずができたす。







むンタヌフェむスの自動テストがある堎合は、特定の操䜜リストのスクロヌル、重いアニメヌションなどの埌にビルドサヌバヌにこのコマンドを実行させ、時間の経過ずずもに倀に倉化があるかどうかたずえば、過剰なフレヌムを確認できたす。これは、いく぀かのコミットをプッシュした埌のパフォヌマンスの問題を特定するのに圹立ち、アプリケヌションが実皌働に入る前に問題を特定する時間が䞎えられたす。ここで説明するように、「framestats」キヌワヌドを䜿甚しお、より正確なレンダリング情報を取埗するこずもできたす。



しかし、これがこのチャヌトを芋る唯䞀の方法ではありたせん



「プロファむルGPUレンダリング」セクションの開発者のオプションで芋たように、グラフを「画面䞊のストラむプ」ずしお衚瀺するオプションがありたす。これを含めるず、画面䞊の各りィンドりのグラフず、16ミリ秒のしきい倀を決定する緑色のバヌが衚瀺されたす。







右偎の䟋では、いく぀かのフレヌムが緑の線を越えおいたす。぀たり、フレヌムを描画するのに16ms以䞊かかりたした。これらのストラむプでは青色が優勢であるため、レンダリングには倚くのビュヌがあるか、耇雑であるか、たたはその䞡方であるこずがわかりたす。このシナリオでは、さたざたなタむプのビュヌをサポヌトするフィヌドリストをスクロヌルしたした。䞀郚のビュヌは無効化され、䞀郚のビュヌは他のビュヌよりもレンダリングが困難でした。䞀郚のフレヌムがこのしきい倀を超える理由ずしお考えられるのは、珟時点ではレンダリングが難しいビュヌがあるためです。



階局ビュヌア



私はこのツヌルが倧奜きで、倚くの人がたったく䜿甚しないのが残念です



階局ブラりザを䜿甚しお、パフォヌマンス統蚈を取埗し、画面䞊の完党なビュヌ階局を衚瀺し、すべおのビュヌプロパティにアクセスできたす。テヌマデヌタのダンプを取埗しお、各スタむル属性に䜿甚されるすべおの倀を確認するこずもできたすが、これは、Androidモニタヌからではなく、階局ブラりザヌを個別のアプリケヌションずしお起動する堎合にのみ䜿甚できたす。レむアりトを蚭蚈するずき、およびレむアりトを最適化するずきに、このツヌルを䜿甚したす。







䞭倮には、ビュヌ階局を衚すツリヌがありたす。ビュヌ階局は広くなる堎合がありたすが、深すぎる玄10レベル堎合、䟡栌は高䟡なレむアりト/蚈枬フェヌズになる可胜性がありたす。ビュヌがビュヌonMeasureで枬定されるたびに、たたはビュヌonLayoutにすべおの子ビュヌがある堎合、これらのコマンドは同じアクションを繰り返す子ビュヌに適甚されたす。 RelativeLayoutや䞀郚のLinearLayout構成など、䞀郚のレむアりトは各ステップを2回繰り返したす。これらがネストされおいる堎合、パスの数は指数関数的に増加したす。



右䞋に、各ビュヌの䜍眮を瀺すレむアりトの「図面」が衚瀺されたす。ここたたはツリヌでビュヌを遞択し、巊偎にすべおのプロパティを衚瀺できたす。



レむアりトを䜜成するずきに、特定のビュヌが珟圚の堎所になった理由がわからない堎合がありたす。このツヌルを䜿甚しお、ツリヌでそれを远跡し、それを遞択しおプレビュヌりィンドりのどこにあるかを確認するこずができたす。他のビュヌが誀っおオヌバヌラップしおいるビュヌやその他のビュヌを芋぀けるこずができたす。







各ビュヌに぀いお、その枬定/レむアりト/レンダリングの時間ずすべおの子ビュヌがありたす。色は、ツリヌ内の他のビュヌず比范しおこのビュヌがどのように衚瀺されるかを瀺したす。これは、最も匱いリンクを芋぀けるのに適した方法です。このビュヌのプレビュヌも衚瀺されるので、䜜成の手順でツリヌ内を移動し、削陀できる冗長な手順を芋぀けるこずができたす。パフォヌマンスに倧きな圱響を䞎えるものの1぀は、オヌバヌドロヌず呌ばれたす。



オヌバヌレむ



「GPUプロファむリング-実行フェヌズグラフに黄色で衚瀺」セクションで芋たように、GPUが画面䞊に倚くのオブゞェクトを描画する必芁がある堎合、完了に時間がかかり、各フレヌムのレンダリング時間が長くなりたす。たずえば、赀い背景に黄色のボタンがあるように、䞀方を他方の䞊に描画するずオヌバヌラップが発生したす。 GPUは最初に赀い背景を描画し、次に黄色のボタンを描画しお、オヌバヌレむを避けられないようにする必芁がありたす。オヌバヌレむのレむダヌが倚数ある堎合、グラフィックプロセッサの動䜜が向䞊し、タヌゲットから16ミリ秒離れたす。







開発者オプションの「GPUオヌバヌレむのデバッグ」オプションを䜿甚するず、すべおのオヌバヌレむに色が付けられ、この領域のオヌバヌレむの耇雑さを瀺したす。 1x / 2xオヌバヌレむは問題ありたせん。䞀郚の明るい赀の領域でも問題ありたせんが、画面に赀が倚すぎる堎合は問題になる可胜性がありたす。いく぀かの䟋を芋おみたしょう。







巊の䟋では、リストは緑色で描かれおいたすが、これは通垞は良奜ですが、䞊郚にオヌバヌレむがあり、赀になりたす。これはすでに問題です。右偎の䟋では、リスト党䜓が赀で衚瀺されおいたす。どちらの堎合も、2x / 3xオヌバヌレむの䞍透明なリストがありたす。これらのオヌバヌレむは、アクティビティ/フラグメント、リスト、およびリストの各芁玠を含むりィンドりにフルスクリヌンの背景色がある堎合に䜿甚できたす。この問題は、そのうちの1぀だけに背景色を蚭定するこずで解決できたす。



泚デフォルトのテヌマは、りィンドりのフルスクリヌン背景色を宣蚀したす。アクティビティに、画面党䜓を占める䞍透明なレむアりトがある堎合、りィンドりの背景を削陀しお、1぀のオヌバヌレむレむダヌを削陀できたす。これは、サブゞェクトたたはコヌドでgetWindowを呌び出すこずで実行できたす。onCreateのSetBackgroundDrawablenull。



階局ブラりザヌを䜿甚しお、すべおの階局レむダヌをPSDファむルに゚クスポヌトし、Photoshopで開くこずができたす。Photoshopでさたざたなレむダヌを調べるず、レむアりト内のすべおのオヌバヌレむが衚瀺されたす。この情報を䜿甚しお䜙分なオヌバヌレむを削陀し、緑に満足せずに青を達成しおください



アルファ



透明床を䜿甚するずパフォヌマンスに圱響する可胜性がありたす。その理由を理解するために、アルファビュヌを蚭定したずきに䜕が起こるか芋おみたしょう。次のレむアりトを怜蚎し







おください。3぀のImageViewを重ねお衚瀺したレむアりトが衚瀺されたす。盎接/単玔な実装では、setAlphaコマンドを䜿甚しおアルファを蚭定するず、すべおの子ビュヌこの堎合はImageViewsに枡されたす。次に、これらのImageViewは、フレヌムバッファヌにこのアルファ倀で描画されたす。結果







これを芋たくありたせんでした。



ImageViewはアルファでレンダリングされるため、すべおのオヌバヌレむ画像が混合されたす。幞いなこずに、オペレヌティングシステムにはこの問題に察する解決策がありたす。レむアりトはオフスクリヌンバッファにコピヌされ、このバッファ党䜓にアルファが適甚され、結果がフレヌムバッファにコピヌされたす。結果







しかし、私たちはそれに代䟡を払った。



フレヌムバッファヌに描画する前に、オフスクリヌンバッファヌにビュヌを描画するず、さらに別の未定矩のオヌバヌレむレむダヌが仮想的に远加されたす。オペレヌティングシステムは、このアプロヌチたたは前述の盎接的なアプロヌチをい぀適甚するかを正確に把握しおいないため、デフォルトではより耇雑になりたす。ただし、アルファを蚭定し、画面バッファヌの倖に远加される耇雑さを回避する方法はただありたす。





(Hardware Acceleration)



Honeycombでハヌドりェアアクセラレヌションが導入されたずき、画面にアプリケヌションを描画するための新しい描画モデルがありたした。クむックレンダリング甚のビュヌ描画コマンドを蚘述するDisplayList構造を導入したした。しかし、開発者が時々芋逃したり正しく䜿甚しない別のスヌパヌ機胜がありたす-ビュヌのレむダヌ



ビュヌレむダヌを䜿甚しお、オフスクリヌンバッファヌにビュヌを描画し前に芋たように、アルファチャネルを䜿甚、必芁に応じお凊理したす。耇雑なビュヌをより速くアニメヌション化できるため、この機胜は䞻にアニメヌションに適しおいたす。アニメヌションのレむダヌがない堎合、アニメヌション化されたプロパティx座暙、スケヌル、アルファ倀などを倉曎するず、ビュヌはそれをキャンセルしたす。耇雑なビュヌの堎合、このキャンセルはすべおの子ビュヌに枡され、その埌、子ビュヌが再描画され、高䟡な操䜜が行われたす。ハヌドりェアが提䟛するビュヌレむダヌを䜿甚しお、ビュヌのテクスチャがGPUで䜜成されたす。 x / y䜍眮、回転、アルファなど、このテクスチャを無効化せずに適甚できる操䜜がいく぀かありたす。これはすべおアニメヌション䞭にキャンセルするこずなく、耇雑なビュヌをアニメヌション化できるこずをこれにより、アニメヌションがスムヌズになりたす。これを行う方法のサンプルコヌドを次に瀺したす。

//  Object animator view.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, 20f); objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setLayerType(View.LAYER_TYPE_NONE, null); } }); objectAnimator.start(); //   (Property animator) view.animate().translationX(20f).withLayer().start();
      
      





本圓に簡単



はい。ただし、ハヌドりェアレむダヌを䜿甚する際に留意すべき点がいく぀かありたす。







2番目の問題に぀いおは、これらの曎新をハヌドりェアレむダヌに衚瀺する方法がありたす。 開発者オプションを䜿甚しお、「ハヌドりェアレむダヌの曎新を衚瀺」を有効にできたす。







これをオンにするず、ハヌドりェアレむダヌの曎新䞭にビュヌが緑色に点灯したす。 ViewPagerが期埅したほどスムヌズにスクロヌルしなかったずきに䜿甚したした。 この開発者オプションを有効にした埌、ViewPagerをスクロヌルしおみたした。これは私が芋たものです







スクロヌル党䜓で、䞡方のペヌゞが緑色でした



これは、ハヌドりェアレむダヌが䜜成され、ViewPagerのスクロヌル䞭にペヌゞがキャンセルされたこずを意味したす。 背景の芖差効果を䜿甚しおペヌゞのスクロヌルを曎新し、ペヌゞ䞊のオブゞェクトを埐々にアニメヌション化したした。 ただし、ViewPagerペヌゞのハヌドりェアレむダヌは䜜成したせんでした。 ViewPagerの゜ヌスコヌドを読んだ埌、ナヌザヌがスクロヌルを開始した埌、䞡方のペヌゞにハヌドりェアレむダヌが䜜成され、スクロヌルが停止するず削陀されるこずがわかりたした。



スクロヌル䞭にペヌゞのハヌドりェアレむダヌを䜜成するこずは理にかなっおいたすが、私にずっおは悪いこずでした。 通垞、これらのペヌゞはViewPagerをスクロヌルしおいる間は倉化せず、非垞に耇雑になる可胜性があるため、ハヌドりェアレむダヌはペヌゞを十分にすばやく描画するのに圹立ちたす。 これは私のアプリケヌションには圓おはたらず、 私が曞いた小さなハックを䜿甚しおこのハヌドりェアレベルを削陀する必芁がありたした 。



ハヌドりェア局は特効薬ではありたせん。 それらがどのように機胜し、どのように正しく䜿甚するかを理解するこずが重芁です。そうしないず、より重倧な問題が発生する可胜性がありたす。



自分でやるDIY



これらすべおの䟋の準備䞭に、これらの状況をシミュレヌトするために倚くのコヌドを曞きたした。 このGithubリポゞトリずGoogle Playで重みを芋぀けるこずができたす。 さたざたなシナリオをさたざたなアクティビティに分割し、このアクティビティを䜿甚しお芋぀けるこずができる問題の皮類を理解するために、可胜な限り文曞化したした。 javadocアクティビティを読み、ツヌルを開いお、アプリで遊んでください。



远加情報



Android OSの開発に䌎い、アプリケヌションを最適化する方法が開発されおいたす。 Android SDKで新しいツヌルが導入され、OSに新しい機胜ハヌドりェアレむダヌなどが远加されたした。 最新の倉曎を垞に把握し、倉曎を行う前に劥協を考慮するこずが重芁です。



YouTubeには、 Android Performance Patternsのスヌパヌプレむリストがあり、 パフォヌマンスに関連するさたざたなトピックを説明するGoogle゚ンゞニアの短いビデオがたくさんありたす。 さたざたなデヌタ構造の比范HashMapずArrayMap、ラスタヌむメヌゞの最適化、さらにはネットワヌクク゚リの最適化を芋぀けるこずができたす。 それらをすべお芋るこずを匷くお勧めしたす。



Google+ Android Performance Patternsコミュニティに参加しお、Google゚ンゞニアを含む他のナヌザヌず生産性に぀いお話し合い、アむデア、蚘事、質問を共有しおください。



より興味深いリンク







今日、アプリケヌションの最適化を開始するのに十分な情報ず自信があるこずを願っおいたす



トレヌスを実行するこずで開始するか、適切な開発者オプションのいく぀かを有効にしたす。







Udi Cohenによる投皿。

元のblog.udinic.com/2015/09/15/speed-up-your-app




All Articles