135
Developers

For Butter or Worse Smoothing Out Performance in Android Uis

Embed Size (px)

Citation preview

Page 1: For Butter or Worse Smoothing Out Performance in Android Uis

Developers

Page 2: For Butter or Worse Smoothing Out Performance in Android Uis

For Butter or WorseSmoothing Out Performance in Android UIs

Chet HaaseRomain GuyAndroid UI Toolkit Engineers

Page 3: For Butter or Worse Smoothing Out Performance in Android Uis

Developers

Page 4: For Butter or Worse Smoothing Out Performance in Android Uis

jank, noun

1. Choppy performance“Swiping the home screen feels janky”

2. Discontinuous, surprising experience“What's with the jank launching that app?”

Page 5: For Butter or Worse Smoothing Out Performance in Android Uis

butter, tasty noun

1. Smooth performance“Home screen swiping is very buttery”

2. Fattening spread and cooking ingredient“America’s obesity problem is directly proportional to the deliciousness of butter”

Page 6: For Butter or Worse Smoothing Out Performance in Android Uis

2. Discontinuous, surprising experience“What's with the jank launching that app?”

jank, noun

1. Choppy performance“Swiping the home screen feels janky”

Page 7: For Butter or Worse Smoothing Out Performance in Android Uis

Recipe

• Butter for eating is made from cream• Butter for Android is made from

- low latency- fast, consistent framerate

Latency

Event Display

Page 8: For Butter or Worse Smoothing Out Performance in Android Uis

Recipe

• Butter for eating is made from cream• Butter for Android is made from

- low latency- fast, consistent framerate

Latency

Event Display

Page 9: For Butter or Worse Smoothing Out Performance in Android Uis

Recipe

• Butter for eating is made from cream• Butter for Android is made from

- low latency- fast, consistent framerate

Latency

Event Display Event Display Event Display Event Display Event Display Event Display Event Display Event Display Event Display Event Display Event Display

Page 10: For Butter or Worse Smoothing Out Performance in Android Uis

Input Latency

Event

Event Queue

EventEvent

EventEvent

ProcessEvents Draw

Page 11: For Butter or Worse Smoothing Out Performance in Android Uis

Input Lag (What a drag)

Page 12: For Butter or Worse Smoothing Out Performance in Android Uis

Input Lag (What a drag)

Page 13: For Butter or Worse Smoothing Out Performance in Android Uis

Input Lag (What a drag)

Page 14: For Butter or Worse Smoothing Out Performance in Android Uis

Input Latency

a

a..c

bUser Input

Time

c d e f g h i j k l m n o p q r s t u v w x

Dispatcher

Activity Proc a..c Draw

d...j

Proc d..j Draw

k..s

Page 15: For Butter or Worse Smoothing Out Performance in Android Uis

Input Latency

a

a..c

bUser Input

Time

c d e f g h i j k l m n o p q r s t u v w x

Dispatcher

Activity Proc a..c Draw

d...j

Proc d..j Draw

k..s

Latency

a

d

c

j

Page 16: For Butter or Worse Smoothing Out Performance in Android Uis

Event Streaming

a bUser Input

Time

c d e f g h i j k l m n o p q r s t u v w x

Activity Proc a..f Draw Proc g..o Draw

VSync VSync

Page 17: For Butter or Worse Smoothing Out Performance in Android Uis

Event Streaming

a bUser Input

Time

c d e f g h i j k l m n o p q r s t u v w x

Activity Proc a..f Draw Proc g..o Draw

VSync VSync

Latency

a

g

f

o

Page 18: For Butter or Worse Smoothing Out Performance in Android Uis

Framerate

Drawing

Drawing faster is a good start

Page 19: For Butter or Worse Smoothing Out Performance in Android Uis

Framerate

Drawing

Drawing faster is a good start

Page 20: For Butter or Worse Smoothing Out Performance in Android Uis

Framerate

But that's not quite all there is to it...

Drawing

Drawing faster is a good start

Page 21: For Butter or Worse Smoothing Out Performance in Android Uis

Drawing: The Big Picture

Event Set PropertyValue Invalidate

Measure & Layout

PrepareDraw

UpdateDisplayList

DrawDisplayList

SwapBuffers

CompositeWindows

PostBuffer

DisplayList

DequeueBuffer

EnqueueBuffer

ActivitySurfaceFlinger

Page 22: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw

Display

ActivitySurfaceFlinger

Page 23: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Event Set PropertyValue Invalidate

Page 24: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Measure & Layout

Page 25: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Measure & Layout

PrepareDraw

DequeueBuffer

Page 26: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Measure & Layout

PrepareDraw

UpdateDisplayList

DisplayList

DequeueBuffer

Page 27: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Measure & Layout

PrepareDraw

UpdateDisplayList

DrawDisplayList

DisplayList

DequeueBuffer

Page 28: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Measure & Layout

PrepareDraw

UpdateDisplayList

DrawDisplayList

SwapBuffers

DisplayList

DequeueBuffer

EnqueueBuffer

Page 29: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

CompositeWindows

PostBuffer

Page 30: For Butter or Worse Smoothing Out Performance in Android Uis

SomethingHappens Draw DisplaySomethingHappens Draw Display

Event Set PropertyValue Invalidate

Measure & Layout

PrepareDraw

UpdateDisplayList

DrawDisplayList

SwapBuffers

CompositeWindows

PostBuffer

DisplayList

DequeueBuffer

EnqueueBuffer

ActivitySurfaceFlinger

Page 31: For Butter or Worse Smoothing Out Performance in Android Uis

VSyncSynchronizing rendering with the display refresh

60 fpsDisplays refresh at 60 Hz, allowing apps to render at 60fps

Page 32: For Butter or Worse Smoothing Out Performance in Android Uis
Page 33: For Butter or Worse Smoothing Out Performance in Android Uis
Page 34: For Butter or Worse Smoothing Out Performance in Android Uis

Tearing

Page 35: For Butter or Worse Smoothing Out Performance in Android Uis

Getting the Pixels to the Screen

Time

CPU GPU Visible

UpdateDisplayList

DrawDisplayList Display

Page 36: For Butter or Worse Smoothing Out Performance in Android Uis

Drawing without VSync

1

0

1

Time

Display 1 1 2

2

2

CPU

GPU

3

VSync VSync VSync VSync

3

3

4

4

Page 37: For Butter or Worse Smoothing Out Performance in Android Uis

Drawing without VSync

1

0

1

Time

Display 1 1 2

2

2

CPU

GPU

3

VSync VSync VSync VSync

3

3

4

4

Jank!

Page 38: For Butter or Worse Smoothing Out Performance in Android Uis

Drawing with VSync

1

0

1

Time

Display 1 2 3

2

2

CPU

GPU

4

VSync VSync VSync VSync

3

3

4

4

Page 39: For Butter or Worse Smoothing Out Performance in Android Uis

Drawing with DisplayLists

set property invalidateset property invalidate

set property invalidateset property invalidate Update

DisplayListDraw

DisplayList

DisplayList

VSync

Page 40: For Butter or Worse Smoothing Out Performance in Android Uis

Drawing with DisplayList Properties

set propertyset property

set propertyset property Draw

DisplayList

DisplayList

VSync

DLProps

Page 41: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList Properties

• Free with ViewPropertyAnimator• Or use ObjectAnimator with View properties

- alpha- translationX/Y- scaleX/Y- rotation/X/Y

Page 42: For Butter or Worse Smoothing Out Performance in Android Uis

0

1

2

3

Tim

e in

ms

Frame

With DisplayList Properties Without DisplayList Properties

Page 43: For Butter or Worse Smoothing Out Performance in Android Uis

Parallel Processing and Double Buffering

B

A

B

Time

Display

VSync

B A B

A

A

B

B

A

A

CPU

GPU

A

VSync VSync VSync

Page 44: For Butter or Worse Smoothing Out Performance in Android Uis

Parallel Processing and Double Buffering

B

A

B

Time

Display A B B

A

A

CPU

GPU

A

VSync VSync VSync VSync

Jank!

Jank!

Page 45: For Butter or Worse Smoothing Out Performance in Android Uis

Parallel Processing and Double BufferingTriple

B

A

B

Time

Display A B C

C

A

CPU

GPU C

A B

B

A

VSync VSync VSync VSync

Jank!

Page 46: For Butter or Worse Smoothing Out Performance in Android Uis

Window Composition

DrawDisplayList

SwapBuffers

CompositeWindows

PostBuffer

ActivitySurfaceFlinger

Page 47: For Butter or Worse Smoothing Out Performance in Android Uis

Window Composition

GPU

DrawDisplayList

SwapBuffers

CompositeWindows

PostBuffer

ActivitySurfaceFlinger

Buffer

Overlay

Overlay

OverlayFB

FB

FB

Overlay

Page 48: For Butter or Worse Smoothing Out Performance in Android Uis

android:sdk $ cd platform-tools/

android:platform-tools $ adb shell ⏎ dumpsys gfxinfo

Page 49: For Butter or Worse Smoothing Out Performance in Android Uis
Page 50: For Butter or Worse Smoothing Out Performance in Android Uis
Page 51: For Butter or Worse Smoothing Out Performance in Android Uis
Page 52: For Butter or Worse Smoothing Out Performance in Android Uis
Page 53: For Butter or Worse Smoothing Out Performance in Android Uis
Page 54: For Butter or Worse Smoothing Out Performance in Android Uis

Demo

Page 55: For Butter or Worse Smoothing Out Performance in Android Uis

0

3

6

9

12

15

Tim

e in

ms

Frames

Update display lists Process display lists Swap buffers

Page 56: For Butter or Worse Smoothing Out Performance in Android Uis

android:sdk $ cd tools/systrace

android:systrace $ ./systrace

Page 57: For Butter or Worse Smoothing Out Performance in Android Uis
Page 58: For Butter or Worse Smoothing Out Performance in Android Uis
Page 59: For Butter or Worse Smoothing Out Performance in Android Uis
Page 60: For Butter or Worse Smoothing Out Performance in Android Uis
Page 61: For Butter or Worse Smoothing Out Performance in Android Uis
Page 62: For Butter or Worse Smoothing Out Performance in Android Uis
Page 63: For Butter or Worse Smoothing Out Performance in Android Uis

Demo

Page 64: For Butter or Worse Smoothing Out Performance in Android Uis

Captures 5 seconds

Page 65: For Butter or Worse Smoothing Out Performance in Android Uis

Stand-alone HTML output

Page 66: For Butter or Worse Smoothing Out Performance in Android Uis

android:sdk $ cd platform-tools/

android:platform-tools $ adb shell ⏎ dumpsys SurfaceFlinger

Page 67: For Butter or Worse Smoothing Out Performance in Android Uis

Demo

Page 68: For Butter or Worse Smoothing Out Performance in Android Uis

type | ... | name ----------+ ... +------- OVERLAY | ... | com...SlowListActivity OVERLAY | ... | StatusBar OVERLAY | ... | NavigationBar

Page 69: For Butter or Worse Smoothing Out Performance in Android Uis

type | ... | name ----------+ ... +------- OVERLAY | ... | com...SlowListActivity OVERLAY | ... | StatusBar OVERLAY | ... | NavigationBar

✔✔✔

Page 70: For Butter or Worse Smoothing Out Performance in Android Uis

type | ... | name ----------+ ... +------ OVERLAY | ... | com...SlowListActivity FB | ... | PopupWindow:424d4cc8 FB | ... | StatusBar FB | ... | NavigationBar

Page 71: For Butter or Worse Smoothing Out Performance in Android Uis

type | ... | name ----------+ ... +------ OVERLAY | ... | com...SlowListActivity FB | ... | PopupWindow:424d4cc8 FB | ... | StatusBar FB | ... | NavigationBar

✘✘

Page 72: For Butter or Worse Smoothing Out Performance in Android Uis

Caveats

Page 73: For Butter or Worse Smoothing Out Performance in Android Uis

traceview

Page 74: For Butter or Worse Smoothing Out Performance in Android Uis

HierarchyViewer

Page 75: For Butter or Worse Smoothing Out Performance in Android Uis

https://github.com/romainguy/ViewServer

Page 76: For Butter or Worse Smoothing Out Performance in Android Uis

Tracer for OpenGL ES

Page 77: For Butter or Worse Smoothing Out Performance in Android Uis

Allocation Tracker

Page 78: For Butter or Worse Smoothing Out Performance in Android Uis

Tips & Tricks

Page 79: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Consistent frame-rate

✔ Lower latency

✔ Faster display list drawing

✔ GPU-free window composition

✔ Faster display list updates

Page 80: For Butter or Worse Smoothing Out Performance in Android Uis

new

Page 81: For Butter or Worse Smoothing Out Performance in Android Uis

new

Page 82: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Consistent frame-rate

Page 83: For Butter or Worse Smoothing Out Performance in Android Uis

public void bindView(View view, Context context, Cursor c) { BookViewHolder holder = (BookViewHolder) view.getTag(); String bookId = c.getString(mInternalIdIndex); holder.bookId = bookId; holder.sortTitle = c.getString(mSortTitleIndex);

final ShelvesActivity activity = mActivity; if (activity.getScrollState() == SCROLL_STATE_FLING || activity.isPendingCoversUpdate()) { holder.title.setCompoundDrawablesWithIntrinsicBounds( null, null, null, mDefaultCover); holder.queryCover = true; } else { holder.title.setCompoundDrawablesWithIntrinsicBounds( null, null, null, ImageUtilities.getCachedCover(bookId, mDefaultCover)); holder.queryCover = false; }

final CharArrayBuffer buffer = holder.buffer; c.copyStringToBuffer(mTitleIndex, buffer); final int size = buffer.sizeCopied; if (size != 0) { holder.title.setText(buffer.data, 0, size); } }

Page 84: For Butter or Worse Smoothing Out Performance in Android Uis

// Do less!

Page 85: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Consistent frame-rate

✔ Lower latency

Page 86: For Butter or Worse Smoothing Out Performance in Android Uis

android.view.Choreographer

Page 87: For Butter or Worse Smoothing Out Performance in Android Uis

// Invalidates at the next v-sync eventmyView.postInvalidateOnAnimation();

Page 88: For Butter or Worse Smoothing Out Performance in Android Uis

callback = new Runnable() { public void run() { setupAndStartAnimation(); }}

myView.postOnAnimation(callback);

Page 89: For Butter or Worse Smoothing Out Performance in Android Uis

callback = new Choreographer.FrameCallback() { public void doFrame(long frameTime) { render(frameTime); }};

Choreographer c = Choreographer.getInstance();c.postFrameCallback(callback);

Page 90: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Consistent frame-rate

✔ Lower latency

Page 91: For Butter or Worse Smoothing Out Performance in Android Uis

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

Page 92: For Butter or Worse Smoothing Out Performance in Android Uis

view.animate().alpha(0).withLayer();

Page 93: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Consistent frame-rate

✔ Faster display list drawing

Page 94: For Butter or Worse Smoothing Out Performance in Android Uis

CLIP PING

Page 95: For Butter or Worse Smoothing Out Performance in Android Uis

view.invalidate();

Page 96: For Butter or Worse Smoothing Out Performance in Android Uis

view.invalidate(left, top, right, bottom);

Page 97: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

Page 98: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

invalidate()

Page 99: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

invalidate()

Draw display lists

Page 100: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

DisplayList

DisplayList

DisplayList

DisplayList DisplayList DisplayList

DisplayList

DisplayList

invalidate()

Draw display lists

Page 101: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

Page 102: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

invalidate(l, t, r, b)

Page 103: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

invalidate(l, t, r, b)

Draw display lists

Page 104: For Butter or Worse Smoothing Out Performance in Android Uis

DisplayList

DisplayList

DisplayList DisplayList

DisplayList DisplayListDisplayList DisplayList

DisplayList

DisplayList

DisplayList

DisplayList

invalidate(l, t, r, b)

Draw display lists

Page 105: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Faster display list drawing

Page 106: For Butter or Worse Smoothing Out Performance in Android Uis
Page 107: For Butter or Worse Smoothing Out Performance in Android Uis
Page 108: For Butter or Worse Smoothing Out Performance in Android Uis

Don’t draw invisible items

Page 109: For Butter or Worse Smoothing Out Performance in Android Uis
Page 110: For Butter or Worse Smoothing Out Performance in Android Uis
Page 111: For Butter or Worse Smoothing Out Performance in Android Uis
Page 112: For Butter or Worse Smoothing Out Performance in Android Uis
Page 113: For Butter or Worse Smoothing Out Performance in Android Uis
Page 114: For Butter or Worse Smoothing Out Performance in Android Uis
Page 115: For Butter or Worse Smoothing Out Performance in Android Uis
Page 116: For Butter or Worse Smoothing Out Performance in Android Uis

@Overridepublic void onDraw(Canvas c) { c.save(); if (stacked) { c.clipRect(headerLeft, headerTop, headerRight, headerBottom); } drawHeader(c); drawContent(c); c.restore();}

Page 117: For Butter or Worse Smoothing Out Performance in Android Uis
Page 118: For Butter or Worse Smoothing Out Performance in Android Uis

clipRect

Page 119: For Butter or Worse Smoothing Out Performance in Android Uis

clipRect

Page 120: For Butter or Worse Smoothing Out Performance in Android Uis

clipRect

Page 121: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Faster display list drawing

Page 122: For Butter or Worse Smoothing Out Performance in Android Uis

private void drawContent(Canvas c) { for (Item item : itemsList) { if (!c.quickReject(item.l, item.t, item.r, item.b, Canvas.EdgeType.BW)) { item.draw(c); } }}

Page 123: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Faster display list drawing

✔ Faster display list updates

Page 124: For Butter or Worse Smoothing Out Performance in Android Uis

Dim layer

Page 125: For Butter or Worse Smoothing Out Performance in Android Uis

getWindow().addFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND);

Page 126: For Butter or Worse Smoothing Out Performance in Android Uis

type | ... | name ----------+ ... +------ OVERLAY | ... | com...MyActivity FB | ... | DimAnimator FB | ... | StatusBar FB | ... | NavigationBar

Page 127: For Butter or Worse Smoothing Out Performance in Android Uis

type | ... | name ----------+ ... +------ OVERLAY | ... | com...MyActivity FB | ... | DimAnimator FB | ... | StatusBar FB | ... | NavigationBar

✘✘

Page 128: For Butter or Worse Smoothing Out Performance in Android Uis

getWindow().addFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND);

Page 129: For Butter or Worse Smoothing Out Performance in Android Uis

getWindow().addFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND);getWindow().setBackground( new ColorDrawable(0x7f000000));

Page 130: For Butter or Worse Smoothing Out Performance in Android Uis

✔ Faster display list drawing

✔ GPU-free window composition

Page 131: For Butter or Worse Smoothing Out Performance in Android Uis

Users love butter

Page 132: For Butter or Worse Smoothing Out Performance in Android Uis

Users love butterSpread the word

Page 133: For Butter or Worse Smoothing Out Performance in Android Uis

For More InformationGoogle I/O 2011

Parleys.comAccelerated Android RenderingVarious Android GUI performance talks

Page 134: For Butter or Worse Smoothing Out Performance in Android Uis

Q&A+Chet Haase+Romain Guy

@chethaase@romainguy

Page 135: For Butter or Worse Smoothing Out Performance in Android Uis

Developers