1 page.title= 2 page.image=images/cards/card-test-performance_2x.png 3 page.keywords=, FPS, 4 5 @jd:body 6 7 8 <div id="qv-wrapper"> 9 <div id="qv"> 10 <h2> </h2> 11 <ol> 12 <li><a href="#measure">UI </a> 13 <ul> 14 <li><a href="#aggregate"> </a></li> 15 <li><a href="#timing-info"> </a></li> 16 <li><a href="#timing-dump"> </a></li> 17 <li><a href="#collection-window"> </a></li> 18 <li><a href="#diagnose"> </a></li> 19 <li><a href="#resources"> </a></li> 20 </ul> 21 </li> 22 <li><a href="#automate">UI </a> 23 <ul> 24 <li><a href="#ui-tests">UI </a></li> 25 <li><a href="#automated-tests"> UI </a></li> 26 <li><a href="#triage"> </a></li> 27 </ul> 28 </li> 29 </ol> 30 </div> 31 </div> 32 33 34 <p> 35 (UI) 60 (<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&index=25&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE"> 60fps?</a>) , <em>jank</em>( ) . 36 37 38 UI , UI . 39 40 41 </p> 42 43 44 <h2 id="measure">UI </h2> 45 46 <p> 47 , . 48 49 50 </p> 51 52 <p> 53 <em><a href="https://source.android.com/devices/tech/debug/dumpsys.html">dumpsys</a></em> Android . 54 55 <em>gfxinfo</em> dumpsys logcat . 56 57 58 </p> 59 60 <pre> 61 > adb shell dumpsys gfxinfo <PACKAGE_NAME> 62 </pre> 63 64 <p> 65 . 66 </p> 67 68 <h3 id="aggregate"> </h3> 69 70 <p> 71 M logcat . . 72 . 73 </p> 74 75 <pre class="noprettyprint"> 76 Stats since: 752958278148ns 77 Total frames rendered: 82189 78 Janky frames: 35335 (42.99%) 79 90th percentile: 34ms 80 95th percentile: 42ms 81 99th percentile: 69ms 82 Number Missed Vsync: 4706 83 Number High input latency: 142 84 Number Slow UI thread: 17270 85 Number Slow bitmap uploads: 1542 86 Number Slow draw: 23342 87 </pre> 88 89 <p> 90 , . 91 92 </p> 93 94 95 <h3 id="timing-info"> </h3> 96 97 <p> 98 M gfxinfo . <em>framestats</em>, . 99 100 101 </p> 102 103 <pre> 104 >adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats 105 </pre> 106 107 <p> 108 , 120 . adb dumpsys gfxinfo 109 <PACKAGE_NAME> framestats . 110 111 </p> 112 113 <pre class="noprettyprint"> 114 0,49762224585003,49762241251670,9223372036854775807,0,49762257627204,49762257646058,49762257969704,49762258002100,49762265541631,49762273951162,49762300914808,49762303675954, 115 0,49762445152142,49762445152142,9223372036854775807,0,49762446678818,49762446705589,49762447268818,49762447388037,49762453551527,49762457134131,49762474889027,49762476150120, 116 0,49762462118845,49762462118845,9223372036854775807,0,49762462595381,49762462619287,49762462919964,49762462968454,49762476194547,49762476483454,49762480214964,49762480911527, 117 0,49762479085548,49762479085548,9223372036854775807,0,49762480066370,49762480099339,49762481013089,49762481085850,49762482232152,49762482478350,49762485657620,49762486116683, 118 </pre> 119 120 <p> 121 . . 122 , . 123 124 </p> 125 126 127 <h4 id="fs-data-format">Framestats </h4> 128 129 <p> 130 CSV . 131 . 132 . 133 </p> 134 135 <ul> 136 <li> 137 <ul> 138 <li> '0' , FRAME_COMPLETED INTENDED_VSYNC . 139 140 </li> 141 142 <li> 0 . , 16ms . 143 144 . 145 <ul> 146 <li> ( ). 147 148 </li> 149 150 <li> . . 151 60fps , . 152 153 154 </li> 155 </ul> 156 </li> 157 </ul> 158 </li> 159 160 <li>INTENDED_VSYNC 161 <ul> 162 <li> . VSYNC , UI vsync . 163 164 165 </li> 166 </ul> 167 </li> 168 169 <li>VSYNC 170 <ul> 171 <li>Vsync .(Choreographer , , View.getDrawingTime() ) 172 173 </li> 174 175 <li>VSYNC <a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=23">VSYNC </a> . 176 177 178 </li> 179 </ul> 180 </li> 181 182 <li>OLDEST_INPUT_EVENT 183 <ul> 184 <li> Long.MAX_VALUE. 185 186 </li> 187 188 <li> . 189 190 </li> 191 </ul> 192 </li> 193 194 <li>NEWEST_INPUT_EVENT 195 <ul> 196 <li> Long.MAX_VALUE. 197 198 </li> 199 200 <li> . 201 202 </li> 203 204 <li> . (FRAME_COMPLETED - NEWEST_INPUT_EVENT) . 205 206 </li> 207 </ul> 208 </li> 209 210 <li>HANDLE_INPUT_START 211 <ul> 212 <li> . 213 </li> 214 215 <li> ANIMATION_START . 216 217 </li> 218 219 <li> (2ms ) . View.onTouchEvent() . 220 221 . , . 222 223 224 </li> 225 </ul> 226 </li> 227 228 <li>ANIMATION_START 229 <ul> 230 <li>Choreographer . 231 </li> 232 233 <li> PERFORM_TRANVERSALS_START ((ObjectAnimator, ViewPropertyAnimator Transitions ) . 234 235 236 </li> 237 238 <li> (2ms ), . ObjectAnimators . 239 240 241 </li> 242 243 <li>Choreographer <a href="https://developers.google.com/events/io/sessions/325418001"> (For Butter or Worse)</a> . 244 245 </li> 246 </ul> 247 </li> 248 249 <li>PERFORM_TRAVERSALS_START 250 <ul> 251 <li> DRAW_START ( 0 ). 252 253 254 </li> 255 256 <li> <a href="https://www.youtube.com/watch?v=we6poP0kw6E&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=27">, </a> . 257 258 259 </li> 260 </ul> 261 </li> 262 263 <li>DRAW_START 264 <ul> 265 <li>PerformTraversals . . 266 267 </li> 268 269 <li> SYNC_START View.draw() . 270 271 </li> 272 273 <li> <a href="{@docRoot}guide/topics/graphics/hardware-accel.html#hardware-model"> </a> <a href="https://www.youtube.com/watch?v=we6poP0kw6E&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=27">, </a> . 274 275 276 </li> 277 </ul> 278 </li> 279 280 <li>SYNC_START 281 <ul> 282 <li> . 283 </li> 284 285 <li> ISSUE_DRAW_COMMANDS_START (0.4ms ), GPU . 286 287 288 </li> 289 290 <li> <a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&index=24&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu"> GPU </a> . 291 292 </li> 293 </ul> 294 </li> 295 296 <li>ISSUE_DRAW_COMMANDS_START 297 <ul> 298 <li> GPU . 299 </li> 300 301 <li> FRAME_COMPLETED GPU . 302 Overdraw . 303 304 </li> 305 </ul> 306 </li> 307 308 <li>SWAP_BUFFERS 309 <ul> 310 <li>EglSwapBuffers , . 311 312 </li> 313 </ul> 314 </li> 315 316 <li>FRAME_COMPLETED 317 <ul> 318 <li> ! FRAME_COMPLETED - INTENDED_VSYNC . 319 320 </li> 321 </ul> 322 </li> 323 324 </ul> 325 326 <p> 327 . (FRAME_COMPLETED - INTENDED_VSYNC) . . 328 329 . 16ms ( ) , . 330 331 . 332 , . 333 334 335 </p> 336 337 <img src="{@docRoot}preview/images/perf-test-framestats.png"> 338 339 340 <h3 id="timing-dump"> </h3> 341 342 <p> 343 <strong> GPU </strong> <strong>adb dumpsys gfxinfo</strong> , <code>adb shell dumpsys gfxinfo</code> 120 , . 344 345 346 . 347 348 </p> 349 350 <p> 351 <a href="#fs-data-format">framestats</a> , . 352 353 . 354 355 </p> 356 357 <img src="{@docRoot}preview/images/perf-test-frame-latency.png"> 358 359 <p> 360 Gfxinfo , . 361 362 </p> 363 364 <p> 365 . . 366 , . 367 368 <a href="https://www.youtube.com/watch?v=we6poP0kw6E&index=27&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE"> </a> . 369 370 371 </p> 372 373 374 <h3 id="collection-window"> </h3> 375 376 <p> 377 Framestats . 2 . 378 (: ), . 379 380 381 </p> 382 383 <pre> 384 >adb shell dumpsys gfxinfo <PACKAGE_NAME> reset 385 </pre> 386 387 <p> 388 2 . 389 390 391 </p> 392 393 394 <h3 id="diagnose"> </h3> 395 396 <p> 397 . 398 dumpsys . 399 . 400 , <a href="{@docRoot}tools/help/systrace.html">systrace</a> . 401 402 </p> 403 404 405 <h3 id="resources"> </h3> 406 407 <p> 408 Android , . 409 410 411 </p> 412 413 <ul> 414 <li> 415 </li> 416 <li> 60fps? 417 </li> 418 <li>Android UI GPU 419 </li> 420 <li> 421 </li> 422 <li>Systrace UI 423 </li> 424 </ul> 425 426 427 <h2 id="automate">UI </h2> 428 429 <p> 430 UI . jank , jank . 431 432 . , . 433 434 435 </p> 436 437 <p> 438 UI . 439 Android M jank , . 440 441 442 443 </p> 444 445 <p> 446 . 447 448 </p> 449 450 <p> 451 . , . . 452 453 454 </p> 455 456 457 <h3 id="ui-tests">UI </h3> 458 459 <p> 460 . . 461 462 </p> 463 464 <h4> 465 / 466 </h4> 467 468 <p> 469 . 470 , UI . 471 472 . 473 </p> 474 475 <ul> 476 <li> ListView RecyclerView 477 </li> 478 479 <li> 480 </li> 481 482 <li> / 483 </li> 484 485 <li> 486 </li> 487 488 <li>Canvas 489 </li> 490 </ul> 491 492 <p> 493 , . 494 495 </p> 496 497 <h4> 498 499 </h4> 500 501 <p> 502 , . 503 . 504 </p> 505 506 <ul> 507 <li> UI ? 508 </li> 509 510 <li> ? 511 </li> 512 513 <li> 90% 98% ? 514 </li> 515 516 <li> 98% ? 517 </li> 518 519 <li> ? 520 </li> 521 </ul> 522 523 <p> 524 , . 525 526 </p> 527 528 <h4> 529 530 </h4> 531 532 <p> 533 . GPU CPU . 534 . . 535 536 , . , , . 537 538 CPU , RAM, , . 539 . 540 541 </p> 542 543 <h4> 544 UI 545 </h4> 546 547 <p> 548 <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> <a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a> . 549 550 , . 551 , . - , . 552 553 554 </p> 555 556 <p> 557 <code>dumpsys gfxinfo</code> . 558 559 560 </p> 561 562 563 <h3 id="automated-tests"> UI </h3> 564 565 <p> 566 UI , , . 567 568 569 570 </p> 571 572 <h4> 573 574 </h4> 575 576 <p> 577 UI (: <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a>) / . 578 <em>dumpsys gfxinfo</em> ADB . 579 <a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner</a> . , . 580 581 582 583 </p> 584 585 <p> 586 UI , monkeyRunner . 587 588 </p> 589 590 <ul> 591 <li> APK ( ) . 592 </li> 593 594 <li>UI Automator UI . 595 </li> 596 597 <li><em>dumpsys gfxinfo</em><em></em> . 598 </li> 599 600 <li> . 601 </li> 602 </ul> 603 604 605 <h3 id="triage"> </h3> 606 607 <p> 608 , . 609 , / ( ) . 610 611 612 , <a href="{@docRoot}tools/help/systrace.html">systrace</a> . , . 613 614 615 </p> 616 617 <h4> 618 619 </h4> 620 621 <p> 622 . 623 , , . 624 625 , . 626 627 628 </p> 629 630 <p> 631 ( '(batch)' ) . . 632 633 634 635 </p> 636 637 <p> 638 . 639 , WRT . 640 641 642 </p> 643 644 <p> 645 UI , . 646 ( ) . 647 648 649 650 </p> 651 652 <p> 653 ? 10 . 50 100 (, ). 654 655 656 </p> 657