ÉÏÒ»´Î¼Ç¼Á˽â¾ö¹ý¶È»æÖƵĹý³Ì£¬ÕâÒ»´Î£¬ÏëÏÈŪÇå¸ö¸ÅÄîÐԵĶ«Î÷£¬¾ÍÊÇÈçºÎÅжÏ˳²»Ë³³©£¿
Õâ¶«Î÷Æäʵ×î³õÎÒ×Ô¼ºÒ²¾õµÃÓеã·Ï»°£¬ÓÃÆðÀ´»á¿¨¾ÍÃ÷ÏÔÊDz»Ë³³©¿©¡£
µ«Õâ¶«Î÷¾Í¸úÎÒºÜÏëͲۺܶàÓ¦ÓÃÒ»Ñù£¬Ã÷Ã÷ÄÇô¿¨»¹·Å³öÀ´Ò»ÑùµÄµÀÀí¡£
ÀíÂÛÓÀÔ¶ÊÇÀíÂÛ£¬Êµ¼ù²ÅÊǵÚÒ»Éú²úÁ¦¡£
ÒòΪÎÒ×Ô¼ºµÄÓ¦ÓÃÒ²Äܸоõµ½¿¨¶Ù£¬ÏÖÔÚ»ØÍ··ÖÎö£¬ÄÜÃ÷°×£¬¿¨¶ÙÓÀÔ¶²»ÊÇ¡°ÓÃÐĵijÌÐòÔ±¡±Ô±¾µÄ³õÖÔ£¬µ«ºÜ¶à¶«Î÷£¬ÕæÐÄÊÇÄÑÑÔÖ®Òþ¡£
Öª´í¾Í¸Ä²ÅÊǺÃÈË...ËùÒÔÒª¸Ä£¬¾ÍÒªÖªµÀ¾¿¾¹´íÔÚÄÄ¡£
1¡¢×ݹÛÈ«¾Ö
¶ÔÓÚ˳³©¶ÈµÄ·ÖÎö£¬Ê×ÏÈÒªÖªµÀÒ»¸öÕûÌåÇé¿ö£¬ÊǾֲ¿£¬»¹ÊÇÈ«¾Ö£¬ÕâÑùÔÚÓÅ»¯ÉϲÅÄÜÓз½Ïò¡£
Èç¹ûÊǾֲ¿ÎÊÌ⣬ÄǾÍÐèÒª×Ðϸ·ÖÎö³ö¾ßÌåµÄÏà¹Ø²Ù×÷£¬Èç¹ûÊÇ´óÌåÉϵÄÎÊÌ⣬ÄÇÔÚ˼¿¼µÄʱºò£¬¾ÍÐèÒª´ÓÕûÌåµÄʵÏÖ»úÖÆÀ´¿¼ÂÇ£¬ÓпÉÄÜÊÇʵÏÖ·½Ê½ÉϳöÏÖÁËÎÊÌâ¡£
ÔÚandroid4.1ÖУ¬¹È¸èÌṩÁËÒ»¸ö¹¤¾ßÀ´£¬½Ð×ö¡° GPU³ÊÏÖģʽ·ÖÎö(Profile
GPU rendering)¡±£¬ÔÚ¿ªÆôÕâ¸ö¹¦Äܺó£¬ÏµÍ³¾Í»á¼Ç¼±£Áôÿ¸ö½çÃæ×îºó128֡ͼÏñ»æÖƵÄÏà¹ØÊ±¼äÐÅÏ¢¡£

Èç¹ûÊÇÔÚ¿ªÆôÓ¦Óúó²Å¿ªÆô´Ë¹¦ÄÜ£¬¼ÇµÃÏȰÑÓ¦ÓýáÊøºóÖØÐÂÆô¶¯¡£
¿ªÆôºó²Ù×÷ÄãÐèÒª·ÖÎöµÄ²¿·Ö£¨±ÈÈ绬¶¯ÁбíÖ®ÀàµÄ£©£¬È»ºóÖ´ÐÐadbÃüÁî
¡¡$ adb shell dumpsys gfxinfo com.xxxx.xxx |
ÔÚÖ´ÐеĽá¹ûÖУ¬ÓÐÒ»¿é½Ð×ö¡°Profile data in ms¡±µ×ÏÂÓÐÒ»¶ÑÊý¾Ý.

Draw:±íʾÔÚJavaÖд´½¨ÏÔʾÁÐ±í²¿·ÖÖУ¬OnDraw()·½·¨Õ¼ÓõÄʱ¼ä¡£
Process£º±íʾäÖȾÒýÇæÖ´ÐÐÏÔʾÁбíËù»¨µÄʱ¼ä£¬viewÔ½¶à£¬Ê±¼ä¾ÍÔ½³¤
Execute£º±íʾ°ÑÒ»Ö¡Êý¾Ý·¢Ë͵½ÆÁÄ»ÉÏÅŰæÏÔʾʵ¼Ê»¨·ÑµÄʱ¼ä¡£ÆäʵÊÇʵ¼ÊÏÔʾ֡Êý¾ÝµÄºǫ́»º´æÇøÓëǰ̨»º³åÇø½»»»ºó²¢½«Ç°Ì¨»º³åÇøµÄÄÚÈÝÏÔʾµ½ÆÁÄ»ÉϵÄʱ¼ä¡£ËùÒÔÕâ¸öʱ¼ä£¬Ò»°ã¶¼ºÜ¶Ì¡£
PS£ºViewÀà°üº¬Surface£¨±äÁ¿ÃûmSurface£©£¬Ã¿¸öSurfaceͨ³£¶ÔÓ¦Á½¸öbuffer£¬Ò»¸öfront
buffer, Ò»¸öback buffer¡£(4.1Ö®ºóÊÇ3¸ö£¬Ò»¸öǰ£¬Á½¸öºó)ÆäÖУ¬back buffer¾ÍÊÇcanvas»æÍ¼Ê±¶ÔÓ¦µÄbitmap
(Ñо¿Android_view_Surface.cpp::lockCanvas)¡£Òò´Ë£¬»æ»×ÜÊÇÔÚback
bufferÉÏ£¬ÐèÒª¸üÐÂʱ£¬Ôò½«back bufferºÍfront buffer»¥»»¡£
Draw + Process + Execute = ÍêÕûÏÔʾһ֡ £¬Õâ¸öʱ¼äҪСÓÚ16ms²ÅÄܱ£´æÃ¿Ãë60Ö¡¡£
½«Êý¾Ý¸´ÖƵ½excelÖУ¨win¼ÇµÃÖðÁи´ÖÆ£¬macϾÍÖ±½Ó¸´ÖƹýÈ¥°É£©£¬È»ºó½«Êý¾ÝÉú³É¡°¶Ñ»ýÖùÐÎͼ¡±

´ÓͼÉÏ¿´£¬ÄÜ¿´³ö¼¸¸öÏÖÏó¡£µÚÒ»£¬È·Êµ4.1µÄ»ÆÓÍÏîÄ¿»¹ÕæµÄÓеã×÷Óã¬Ã¿Ö¡µÄʱ¼ä¿ØÖÆÔÚ16ms×óÓÒ¡£µÚ¶þ£¬Óм¸Ö¡³¬¹ý16ms£¬È·Êµ»áÓжªÖ¡µÄÏÖÏó¡£
¿´À´£¬Ò³ÃæµÄ¿¨¶ÙÓ¦¸ÃÊǸö±ð²Ù×÷µÄÎÊÌâ¡£
µ«ÕâÖÖÊý¾ÝÊÇ·ñ»¹ÄÜ¿´³öÆäËûÎÊÌâÄØ£¿
°´ÕÕ3¸öÊý¾Ý·Ö±ð±êʾµÄÄÚÈÝ£¬ÀíÂÛÀ´½²£¬Èç¹ûUIÏß³ÌÕ¼ÓõÄʱ¼ä¹ý³¤£¬DrawµÄʱ¼äÊý¾Ý»áÓ¦¸Ã»áºÜ³¤£¬ËùÒÔ×öÁ˸öʵÑ飬ÔÚUIÏß³ÌÖÐ˯ÁË1S¡£µÃµ½ÁËÏÂÃæÕâ¸öͼ¡£

´ÓͼÉÏ¿´Óм¸Ö¡Draw²¿·ÖÒì³£µÄ¸ß¾ÍÄÜ¿´³ö£¬Draw²¿·ÖÄÜ¿´³öUIÏ̵߳ĴóÌåʹÓÃÇé¿ö¡£
µ±È»£¬ÆäʵÕâ¸öÊý¾ÝÖ÷ÒªÄÜ¿´³öµÄÊÇÕûÌåÇé¿ö£¬µ¥¶ÀµÄij¸ö²¿·Ö¸ú²âÊԵĻ·¾³Ò²Óкܴó¹ØÏµ£¬±ÈÈçÒ»ÏÂ2×éÊý¾Ý£¬¶¼ÊÇinstagramµÄ£¬Í¬ÑùµÄÊý¾Ý£¬ÉÏÃæÊÇDesire
Z 4.1ϵͳ£¬ÏÂÃæÊǸÇ3 4.1ϵͳ£¬ÔÚExecute²¿·Ö£¬Á½ÕßÓÐÃ÷ÏԵIJî¾à¡£


2¡¢¾ßÌå·ÖÎö
¡°GPU³ÊÏÖģʽ·ÖÎö¡±µÄÊý¾ÝÖ»ÄÜ˵Ã÷¸öÏÖÏ󣬱ÈÈçÉÏÃæÌáµ½µÄÊý¾Ý£¬ÄÜ˵Ã÷ÔÚʵ¼ÊÔËÐÐÖлáÓжÌÔݵij¤Ê±¼ä»æÖÆÎÊÌâ¡£µ«Ôì³ÉÎÊÌâµÄ¾ßÌåÔÒò²¢Ã»ÓÐ˵Ã÷¡£
¶øÇÒ¡°GPU³ÊÏÖģʽ·ÖÎö¡±ÏÔʾµÄÊÇ×îºó128Ö¡µÄÊý¾Ý£¬µ«¶ªÖ¡Ò²ÓпÉÄÜÊÇÁ½Ö¡Ö®¼ä´æÔÚ³¤Ê±¼äµÄ²Ù×÷¶øÔì³ÉµÄ¡£¡¡¡¡
ËùÒÔÎÒÃÇÐèÒª·ÖÎöÖ¡ÓëÖ¡Ö®¼äµÄÇé¿ö£¬²ÅÄܶÔËù·ÖÎöÓ¦ÓõÄÕûÌåÐÔÄÜÇé¿öÓиö¸üÉýÈëµÄÁ˽⡣
ÔÚandroidÖÐÌṩÁËÁ½¸ö¹¤¾ßÀ´´ïµ½Õâ¸öÄ¿µÄ£º1¡¢Systrace (Õ⹤¾ß¿ÓµÄÎÒ....µÈÏÂÔÙͲÛ)
2¡¢traceview
SystraceÊǶÔÕû¸öϵͳ½øÐзÖÎö£¬Êý¾Ý±È½Ï׼ȷ£¬µ±È»Ò²°üÀ¨ÎÒÃÇËùÒª·ÖÎöµÄÓ¦Óá£
µ±Õâ¸ö¹¤¾ßµÄʹÓÃÊÇÓÐÌõ¼þÏÞÖÆµÄ£º
£¨1£©ÊÇ4.1Ö®ºó²ÅÌṩµÄ¹¤¾ß¡£
£¨2£©ÊÖ»úµÄÄÚºËÒ»¶¨ÒªÖ§³Ötrace£¨¿ÉÒԲ鿴ÊÇ·ñ´æÔÚ/sys/kernel/debug/tracing
Õâ¸öĿ¼£©£¬ËùÒԺܶàµÚÈý·½ROM»òÕßÈýÐÇÖ®ÀàµÄrom¶¼ÔÚÄÚºËÖÐremoveÁËÕâ¸öÄ£¿é¡£Ä£ÄâÆ÷ÀïÃæºÃÏñÒ²¶¼Ã»ÓС£[Õâ¸ö¿ÓµÄÎÒË¢ÁËÎÞÊý¶àµÄrom²ÅÕÒµ½ÊʺϵÄ...֮ǰµÄone
xÎҼǵúÃÏñÒ²ÓУ¬Õâ¸öÒ²¼ä½Ó˵Ã÷Ò»µã£¬×÷Ϊ¿ª·¢Õߣ¬»¹ÊǹԹԵÄÂòÇ×¶ù×ÓºÃ]
SystraceµÄÔËÐз½Ê½ÓÐÁ½ÖÖ£¬Ò»ÖÖÊÇÔËÐÐsdk°üϵÄpyÎļþ£¬ÕâÖÖÒªÇóµÄ»·¾³ÅäÖñȽ϶ࡣÁíÒ»ÖÖ¾ÍÊÇÔÚadtÏµĹ¤¾ß£¬µã»÷Ö±½ÓÔËÐС£ËùÒÔÏÂÃæµÄʹÓýéÉÜÖ÷ÒªÊÇÕâÖÖ¡£


ÔÚÁ÷³©³Ì¶ÈµÄÕâÖÖÌØÊâ·ÖÎöÇé¾°Ï£¬ÎÒÃÇÒ»°ãÖ»¹Ø×¢Í¼ÐÎÐÔÄÜ¡£ËùÒÔÎÒÃÇҪѡÔñGraphicsºÍView.»¹ÓÐÆäËûºÜ¶àÑ¡ÏÈç¹ûÊÇÔÚ×öÒôƵ´¦Àí»òÕßÊÓÆµ²¥·ÅµÄ·ÖÎö²âÊÔ»°£¬¿ÉÒÔÑ¡ÔñÆäËûÑ¡Ïî¡£¡¡¡¡
È·ÈÏÔËÐÐÖ®ºó£¬¹öÂÖÎÒÃÇÒª²âÊÔµÄÁÐ±í£¬¹¤¾ß»á¼Ç¼5ÃëÖÓµÄÊý¾Ý£¬Ö®ºóÎÒÃǻصõ½Ò»¸öhtmlÒ³Ãæ¡£´ò¿ªºó£¬ÎÒÃÇÄÜ¿´µ½Ò³ÃæÖÐÏÔʾÁËϵͳÖÐÒ»ÇÐÔËÐÐÇé¿öµÄ¸ÅÊö¡£
ä¯ÀÀµÄ²Ù×÷ʱͨ¹ýWASDÀ´Íê³É£¬W/S ·Å´ó/ËõС A/D ×óÒÆ/ÓÒÒÆ
Ò³ÃæÖÐÓиösurfaceFlinger£¬ÖªµÀandroid»æÖÆÔÀíµÄÈËÓ¦¸ÃÄÜÃ÷°×£¬Õâ¸ö¾ÍÊǸºÔð»æÖÆAndroidÓ¦ÓóÌÐòUIµÄ·þÎñ£¬ËùÒÔsurfaceFlingerÄÜ·´Ó¦³öÕûÌ廿֯Çé¿ö£¬Ò»°ãÕý³£Çé¿ö¶¼ÊÇÁ¬ÐøµÄ£¬Èç¹û³öÏÖ¿Õµµ£¬Ò»ÖÖÊÇûÓвÙ×÷»òÕß»¬¶¯µ½Í·£¬Ã»¶«Î÷ÐèÒª»æÖÆ£¬ÕâÖÖÊôÓÚÕý³££¬ÁíÒ»ÖÖ¾ÍÊÇÓÐÎÊÌâ´æÔÚ£¬ÓÐÆäËû²Ù×÷ʱ¼ä¹ý³¤¡£
¶ÔÓ¦ËùÒª·ÖÎöµÄ³ÌÐòÄÇÐУ¬·Å´óºó¾ÍÄÜ¿´µ½¾ßÌåµÄÇé¿ö£¬µã»÷ºóÄÜ¿´µ½Ã¿¸ö²¿·ÖËùʹÓõÄʱ¼ä¡£
±ÈÈç
deliverInputEventÊÇϵͳÌṩµÄ´¥Ãþʼþ¡£
performTraversalsÊÇ¿ªÊ¼²¼¾Ö²¢ÇÒ»æ»ÏÔʾ»ÃæµÄ¹ý³Ì¡£
drawÊǻ滵Ĺý³Ì¡£
...
¶ÔÓÚÒ»¸ölistview£¬Èç¹ûdeliverInputEvent¹ý³¤£¬ºÜÓпÉÄÜÊÇÔÚadapterÖеÄgetView·½·¨Öд¦Àíʱ¼ä¹ý³¤µ¼Ö¡£
ËùÒÔͨ¹ýSystraceµÄÊý¾Ý£¬¿ÉÒÔ´óÌåÉϵķ¢ÏÖÊÇ·ñ´æÔÚÐÔÄÜÎÊÌâ¡£
µ«Èç¹ûÒªÖªµÀ¾ßÌåÇé¿ö£¬¾ÍÐèÒªÓõ½ÁíÍâÒ»¸ö¹¤¾ß¡£
traceview
Õâ¸ö¹¤¾ßÆäʵ±È½Ï¼òµ¥£¬ÊÇÒ»¸ö·ÖÎöÆ÷£¬¼Ç¼ÁËÓ¦ÓóÌÐòÖÐÿ¸öº¯ÊýµÄµÄÖ´ÐÐʱ¼ä¡£ÔÚDDMSÖУ¬Ñ¡ÖÐÒª·ÖÎöµÄ½ø³¡£¬µã»÷¡°Start
method profiling¡±£¨¾ÍÊÇÓÒÉϽÇÓиöºìµãµÄͼ±ê£©¡£È»ºó¿ªÊ¼²Ù×÷Òª·ÖÎöµÄÓ¦Óã¬È»ºóÔٴεã»÷°´Å¥À´Í£Ö¹¸ú×Ù¡£¡¡¡¡
È»ºóÏÂÃæÏÔʾµÄÊý¾ÝÓ¦¸ÃͦͨË×Ò×¶®µÄ¡£
¾ßÌåµÄ¿ÉÒԲμû£ºhttp://hubingforever.blog.163.com/blog/static/17104057920112825035143/

ÕâÀïÎÒÏë½éÉÜÏÂÎÒʹÓõÄÒ»¸ö¾Ñé¡£
ViewRootImpl.draw()£¬Õâ¸öÊÇ»æÖƺ¯Êý£¬µã»÷ºó£¬»æÖƵIJ¿·Ö¾Í»á±»Í»³ö³öÀ´¡£´ÓÀíÂÛÉϽ²£¬Ö»Òª²Ù×÷ʱûÓÐÌ«¶àÍ£¶Ù£¬draw()µÄͼʾӦ¸ÃÊǽÏΪÁ¬ÐøµÄ¡£²¢ÇÒÒª±£³Ö˳³©£¬Ã¿Ò»¸ödrawÇøÓòÓ¦¸ÃÔÚ16ms¼°ÒÔÏ¡£
ËùÒÔÒ»µ©¿´µ½ÇøÓòÓдóÓÚ16msµÄ£¬¾Í¿ÉÒÔÈÏÕæ·ÖÎöÏ£¬¿´¿´¶¼×öÁËЩʲô²Ù×÷¡£´Ó¶øÕÒµ½µ¼Ö»æÖÆÊ±¼ä¹ý³¤µÄÎÊÌâËùÔÚ¡£
¶ÔÓÚÕâЩ¹¤¾ßµÄʹÓã¬ËäÈ»ºÜ´ó³Ì¶ÈÉÏÄܹ»°ïÖúÎÒÃǸü¿ìµÄ¶¨Î»µ½ÎÊÌâÖ®´¦£¬µ«»¹ÊÇÓÐÐí¶à¾ÖÏ޵ĵط½¡£
Èç¹û¶ÔandroidÕûÌåϵͳÔÀíÓÐÒ»¶¨µÄÀí½â£¬²¢ÇÒÉî¿ÌÖªµÀ×Ô¼ºµÄ³ÌÐòµÄÔËתÇé¿ö£¬ÕâÑù·ÖÎöÆðÀ´£¬²Å»á¯»ð´¿Çà¡£
ÒÔÉÏÊÇÎÒ¸öÈ˵ÄһЩ¿´·¨£¬Ï£ÍûÄܰïÖúµ½´ó¼Ò£¬Ã»Ð´µÄ̫ϸ£¬¹»Óþͺã¬ÒòΪÓÐЩ²¿·Ö£¬×Ô¼ºÒ²ÓкܶàÒÉÎÊ£¬ÕÒµ½ÁËÒ»¶Ñ×ÊÁÏ£¬·¢ÏÖҲûÓÐ˵Ã÷µÄÌØ±ðÏêϸµÄµØ·½¡£
|