ç§ã®ã«ãŒã«
ããã©ãŒãã³ã¹ã®åé¡ãçºçãããã³ã«ã次ã®ã«ãŒã«ã«åŸããŸãã
- åžžã«æž¬å®ãã -ããªãã®ç®ã§æé©åããããšã¯æªãèãã§ãã åãã¢ãã¡ãŒã·ã§ã³ãäœåºŠãèŠããšããããéãåãããã«æãããŸãã æ°åã¯åãã€ããªãã ç§ã説æããããŒã«ã䜿çšããå€æŽãå ããååŸã«ã¢ããªã±ãŒã·ã§ã³ã®åäœãæ°å枬å®ããŸãã
- äœéããã€ã¹ã䜿çšãã -ãã¹ãŠã®åŒ±ç¹ãèŠã€ãããå Žåã¯ãäœéããã€ã¹ã圹ç«ã¡ãŸãã æ°ããçç£çãªããã€ã¹ã§ã¯ãæœåšçãªããã©ãŒãã³ã¹ã®åé¡ã¯è¡šç€ºãããããã¹ãŠã®ãŠãŒã¶ãŒãæé«ã®ããã€ã¹ãæã£ãŠããããã§ã¯ãããŸããã
- ãã¬ãŒããªã âããã©ãŒãã³ã¹ã®æé©åã¯ãã¹ãŠãã¬ãŒããªãã§ãã ããªãã¯å¥ã®ãã®ãšåŒãæãã«äžã€ãæé©åããŸãã å€ãã®å Žåããã®ä»ã®ãã¬ãŒããªãã¯ããã©ãŒãã³ã¹ã®æ€åºãšä¿®æ£ã«è²»ããããæéã§ãããããããããã®å質ãŸãã¯ç¹å®ã®ããŒã¿æ§é ã«æ ŒçŽããå¿ èŠãããããŒã¿ã®éã§ããããŸãã äœããç ç²ã«ããæºåãããŠãã ããã
ã·ã¹ãã ãã¬ãŒã¹ïŒ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ã¯ã¢ã«ãã¡ã§ã¬ã³ããªã³ã°ãããããããã¹ãŠã®ãªãŒããŒã¬ã€ç»åãæ··åãããŸãã幞ããªããšã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ã¯ãã®åé¡ã«å¯Ÿãã解決çããããŸããã¬ã€ã¢ãŠãã¯ãªãã¹ã¯ãªãŒã³ãããã¡ã«ã³ããŒããããã®ãããã¡å šäœã«ã¢ã«ãã¡ãé©çšãããçµæããã¬ãŒã ãããã¡ã«ã³ããŒãããŸããçµæïŒ
ããããç§ãã¡ã¯ããã«ä»£äŸ¡ãæã£ãã
ãã¬ãŒã ãããã¡ãŒã«æç»ããåã«ããªãã¹ã¯ãªãŒã³ãããã¡ãŒã«ãã¥ãŒãæç»ãããšãããã«å¥ã®æªå®çŸ©ã®ãªãŒããŒã¬ã€ã¬ã€ã€ãŒãä»®æ³çã«è¿œå ãããŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ããã®ã¢ãããŒããŸãã¯åè¿°ã®çŽæ¥çãªã¢ãããŒãããã€é©çšããããæ£ç¢ºã«ææ¡ããŠããªããããããã©ã«ãã§ã¯ããè€éã«ãªããŸãããã ããã¢ã«ãã¡ãèšå®ããç»é¢ãããã¡ãŒã®å€ã«è¿œå ãããè€éããåé¿ããæ¹æ³ã¯ãŸã ãããŸãã
- TextViews-setAlphaïŒïŒã®ä»£ããã«setTextColorïŒïŒã䜿çšããŸããããã¹ãã®è²ã«ã¢ã«ãã¡ãã£ãã«ã䜿çšãããšããã®ãã£ãã«ã䜿çšããŠããã¹ããçŽæ¥æç»ã§ããŸãã
- ImageView-setAlphaïŒïŒã®ä»£ããã«setImageAlphaïŒïŒã䜿çšããŸããTextViewãšåãçç±ã
- â , . , . hasOverlappingRendering() false, / . , onSetAlpha() true.
(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();
æ¬åœã«ç°¡åïŒ
ã¯ãããã ããããŒããŠã§ã¢ã¬ã€ã€ãŒã䜿çšããéã«çæãã¹ãç¹ãããã€ããããŸãã
- 衚瀺åŸã®ã¯ãªãŒã³ã¢ãã -ããŒããŠã§ã¢ã¬ã€ã€ãŒã¯ãã¡ã¢ãªãéãããŠããã³ã³ããŒãã³ãã§ããGPUã®ã¹ããŒã¹ãæ¶è²»ããŸãã ã¢ãã¡ãŒã·ã§ã³ãªã©ã§å¿ èŠãªå Žåã«ã®ã¿äœ¿çšããŠã¿ãŠããããã«ããŠãã ããã äžèšã®ObjectAnimatorã®äŸã§ã¯ãã¢ãã¡ãŒã·ã§ã³ã®çµäºåŸã«ãªã¹ããŒã䜿çšããŠã¬ã€ã€ãŒãåé€ããŸããã ããããã£ã¢ãã¡ãŒã¿ãŒã®äŸã§ã¯ãwithLayersïŒïŒã¡ãœããã䜿çšããŸããããã®ã¡ãœããã¯ãã¢ãã¡ãŒã·ã§ã³ã®æåã«ã¬ã€ã€ãŒãèªåçã«äœæããã¢ãã¡ãŒã·ã§ã³ã®æåŸã«åé€ããŸãã
- ããŒããŠã§ã¢ã¬ã€ã€ãŒã®é©çšåŸã«ãã¥ãŒãå€æŽãããšãããŒããŠã§ã¢ã¬ã€ã€ãŒãç¡å¹ã«ãªãããã¥ãŒå šäœããªãã¹ã¯ãªãŒã³ãããã¡ãŒã«åã³ã¬ã³ããªã³ã°ãããŸãã ããã¯ãããŒããŠã§ã¢ã¬ã€ã€ãŒã«æé©åãããŠããªãããããã£ãå€æŽããåŸã«çºçããŸãïŒå転ãã¹ã±ãŒãªã³ã°ãx / yã移åãå転ç¹ãã¢ã«ãã¡ãæé©åãããŸãããããŒããŠã§ã¢ã¬ã€ã€ãŒãæŽæ°ãããšãªãŒããŒããããçºçããããã䜿çšãã䟡å€ããªãå ŽåããããŸãã
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ãšã³ãžãã¢ãå«ãä»ã®ãŠãŒã¶ãŒãšçç£æ§ã«ã€ããŠè©±ãåããã¢ã€ãã¢ãèšäºã質åãå ±æããŠãã ããã
ããèå³æ·±ããªã³ã¯ïŒ
- Androidã§ã®Graphics Architectureã®ä»çµã¿ãã芧ãã ããã Androidãã€ã³ã¿ãŒãã§ã€ã¹ãæç»ããæ¹æ³ãSurfaceFlingerãªã©ã®ããŸããŸãªã·ã¹ãã ã³ã³ããŒãã³ããããã³ããããçžäºã«éä¿¡ããæ¹æ³ã«ã€ããŠã®ãã¹ãŠããããŸãã é·ãèªã¿ç©ã§ãããããã ãã®äŸ¡å€ããããŸãã
- Google IO 2012ãšã®äŒè©±ãæç»ã¢ãã«ãã©ã®ããã«æ©èœããã€ã³ã¿ãŒãã§ã€ã¹ã®ã¬ã³ããªã³ã°äžã«ãã¬ãŒããã©ã®ããã«çºçãããã瀺ããŸãã
- Android Performance WorkshopãšDevoxx 2013ã®éã®äŒè©±ãAndroid4.4ã§äœãããæç»ã¢ãã«ã®æé©åãããã€ã瀺ããããã©ãŒãã³ã¹ãæé©åããããã®ããŸããŸãªããŒã«ïŒã·ã¹ãã ãã¬ãŒã¹ããªãŒããŒã¬ã€ãªã©ïŒã瀺ããŸãã
- äºé²çæé©åã«é¢ããåªããèšäºãšãããããæ©ææé©åãšã©ã®ããã«ç°ãªããã å€ãã®éçºè ã¯ãã³ãŒãã®äžéšãæé©åããªããããå€æŽã¯ãã€ããŒã ãšèããŠããŸãã èŠããŠããã¹ãããšã®1ã€ã¯ããã¹ãŠãæãç³ãŸããŠããå Žåã 倧ããªåé¡ãçºçããå¯èœæ§ãããããšã§ãã éèŠã§ãªããšæãããå°ããªéšåãæé©åããæ©äŒãããå Žåã¯ããããç¡èŠããªãã§ãã ããã
- Androidã®ã¡ã¢ãªç®¡çã¯ãGoogle IO 2011ã®å€ããããªã§ãããä»ã§ãé¢é£ããŠããŸãã Androidãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªã管çããæ¹æ³ãšãEclipse MATãªã©ã®ããŒã«ã䜿çšããŠåé¡ãèŠã€ããæ¹æ³ã瀺ããŠããŸãã
- Googleã®ãšã³ãžãã¢ã§ããRomain Guyãäœæãã人æ°ã®twitterã¯ã©ã€ã¢ã³ãã®æé©åäºäŸã®ç 究 ã ãã®ã±ãŒã¹ã¹ã¿ãã£ã§ã¯ãRomainãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã®åé¡ãèŠã€ããæ¹æ³ãšããããã解決ããããã«æšå¥šããããšã瀺ããŸãã åãã¢ããªã±ãŒã·ã§ã³ã®ãªã¯ãŒã¯åŸã®åé¡ã瀺ããã©ããŒã¢ãããã¹ãããããŸãã
ä»æ¥ãã¢ããªã±ãŒã·ã§ã³ã®æé©åãéå§ããã®ã«ååãªæ å ±ãšèªä¿¡ãããããšãé¡ã£ãŠããŸãïŒ
ãã¬ãŒã¹ãå®è¡ããããšã§éå§ããããé©åãªéçºè ãªãã·ã§ã³ã®ããã€ããæå¹ã«ããŸãã
Udi Cohenã«ããæçš¿ã
å ã®blog.udinic.com/2015/09/15/speed-up-your-app