google i/o 2013 - android graphics performance
DESCRIPTION
Engineers from the Android UI Graphics team will show some tips, tricks, tools, and techniques for getting the best performance and smoothest UI for your Android applications.TRANSCRIPT
![Page 1: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/1.jpg)
![Page 2: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/2.jpg)
![Page 3: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/3.jpg)
&Graphics Performance
![Page 4: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/4.jpg)
&Chet Haase Romain Guy
![Page 5: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/5.jpg)
Architecture1
![Page 6: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/6.jpg)
Reordering & merging
![Page 7: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/7.jpg)
Save Cancel
Maximize compatibility
Include metadata
![Page 8: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/8.jpg)
![Page 9: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/9.jpg)
Include metadata Maximize compatibility CancelSave
Order of drawing commands
![Page 10: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/10.jpg)
Include metadata Maximize compatibility CancelSave
1. Re-ordering
![Page 11: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/11.jpg)
Include metadata
Maximize compatibility
Cancel
Save
2. Merging
![Page 12: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/12.jpg)
![Page 13: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/13.jpg)
Multi-threading
![Page 14: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/14.jpg)
![Page 15: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/15.jpg)
Drawing
![Page 16: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/16.jpg)
Drawing
Shadows
Shadows
Shadows
Shadows
![Page 17: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/17.jpg)
Drawing
Paths
Paths
Shadows
Shadows
Shadows
Shadows
![Page 18: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/18.jpg)
Non-rectangular clipping
![Page 19: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/19.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Clip with a shape Path clip = getPath(); canvas.clipPath(clip);
// Draw the content for (int i = 0; i < mLines,length; i++) { TextLine line = mLines[i]; canvas.drawText(line.text, line.x, line.y, mPaint); }}
![Page 20: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/20.jpg)
Developer Tools2
![Page 21: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/21.jpg)
Overdraw
![Page 22: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/22.jpg)
Overdraw
![Page 23: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/23.jpg)
Overdraw
![Page 24: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/24.jpg)
OverdrawBlueGreenRedDeep Red
1x2x3x4x
![Page 25: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/25.jpg)
0
3
6
9
12
15
Tim
e in
ms
Frames
Update display lists Process display lists Swap buffers
![Page 26: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/26.jpg)
![Page 27: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/27.jpg)
![Page 28: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/28.jpg)
performTraversals
draw
getDL drawDisplayList
systrace
flush drawing commands
![Page 29: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/29.jpg)
android:sdk $ cd platform-tools/
android:platform-tools $ ⏎ ./systrace.py gfx view freq sched
![Page 30: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/30.jpg)
![Page 31: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/31.jpg)
import android.os.Trace;
@Overridepublic View getView(int pos, View view, ViewGroup parent) { Trace.beginSection("getView"); if (view == null) { view = createView(); }
// Trace time spent binding data Trace.beginSection("bind"); bindView(pos, view); Trace.endSection();
Trace.endSection(); return view;}
![Page 32: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/32.jpg)
android:sdk $ cd platform-tools/
android:platform-tools $ ⏎ ./systrace.py -a com.example.myapp
![Page 33: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/33.jpg)
Tips & Tricks3
![Page 34: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/34.jpg)
Overdraw demo
![Page 35: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/35.jpg)
Trilinear filtering
![Page 36: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/36.jpg)
![Page 37: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/37.jpg)
Off On
![Page 38: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/38.jpg)
private void loadData() { // Load bitmap Bitmap b = getBitmap();
// Enable trilinear filtering b.setHasMipMap(true);}
![Page 39: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/39.jpg)
<bitmap android:mipMap="true" android:src="@drawable/my_drawable" />
![Page 40: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/40.jpg)
Canvas layers
![Page 41: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/41.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Create a clipped layer canvas.save(); canvas.saveLayer(x, y, width, height, Canvas.CLIP_TO_LAYER_SAVE_FLAG);
// Draw stuff canvas.drawBitmap(bugDroid, 0.0f, 0.0f, null); canvas.restore();}
![Page 42: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/42.jpg)
saveLayer()
![Page 43: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/43.jpg)
![Page 44: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/44.jpg)
![Page 45: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/45.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Create an unclipped layer canvas.save(); canvas.saveLayer(x, y, width, height, 0);
// Draw stuff canvas.drawBitmap(bugDroid, 0.0f, 0.0f, null); canvas.restore();}
![Page 46: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/46.jpg)
saveLayer()
![Page 47: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/47.jpg)
![Page 48: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/48.jpg)
![Page 49: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/49.jpg)
Using alpha with care
![Page 50: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/50.jpg)
![Page 51: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/51.jpg)
view.setAlpha(0.5f);View.ALPHA.set(view, 0.5f);ObjectAnimation.ofFloat(view, "alpha", 0.5f)view.animate().alpha(0.5f);view.setAnimation(new AlphaAnimation(1.0f, 0.5f));
![Page 52: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/52.jpg)
view.setAlpha(0.5f);View.ALPHA.set(view, 0.5f);ObjectAnimation.ofFloat(view, "alpha", 0.5f)view.animate().alpha(0.5f);view.setAnimation(new AlphaAnimation(1.0f, 0.5f));
Canvas.saveLayerAlpha(l, t, r, b, 127, Canvas.CLIP_TO_LAYER_SAVE_FLAG);
==
![Page 53: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/53.jpg)
![Page 54: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/54.jpg)
![Page 55: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/55.jpg)
![Page 56: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/56.jpg)
![Page 57: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/57.jpg)
lternatives
![Page 58: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/58.jpg)
// Not thistextView.setAlpha(alpha);
// But thisint newTextColor = (int) (0xFF * alpha) << 24 | baseTextColor & 0xFFFFFF;textView.setTextColor(newTextColor);
![Page 59: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/59.jpg)
// Not thisimageView.setAlpha(alpha);
// But thisimageView.setImageAlpha((int) (alpha * 255));
![Page 60: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/60.jpg)
// Not thiscustomView.setAlpha(alpha);
// But thisint alpha = (int) (255 * slider.getProgress() / 100.0f);paint.setAlpha(alpha);canvas.draw*(..., paint);
![Page 61: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/61.jpg)
// Or use a layerview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
// Transient layerview.animate().alpha(0).withLayer();
![Page 62: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/62.jpg)
// API level 16+@Overridepublic boolean hasOverlappingRendering() { // Don't lie to us! return false;}
![Page 63: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/63.jpg)
640 dp
400
dp
Canvas
![Page 64: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/64.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Get the dimensions of the Canvas int w = canvas.getWidth(); int h = canvas.getHeight();
canvas.drawRect(0, 0, w, h, mPaint);}
![Page 65: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/65.jpg)
1280 px
800
px
View
300
px
600 px
![Page 66: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/66.jpg)
![Page 67: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/67.jpg)
With hardware rendering
600x300 px (size of the View)
![Page 68: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/68.jpg)
With hardware rendering
With software rendering
600x300 px
1280x800 px
(size of the View)
(size of the window)
![Page 69: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/69.jpg)
✂Clipping
![Page 70: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/70.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Keep the jellybeans canvas.clipRect(l, t, r, b); // Rotate the jar canvas.rotate(-30.0f, pX, pY); // Draw the jar canvas.drawBitmap(mJellyBeans, x, y, null);}
![Page 71: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/71.jpg)
![Page 72: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/72.jpg)
1. Clip
![Page 73: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/73.jpg)
2. Rotate
![Page 74: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/74.jpg)
3. Draw
![Page 75: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/75.jpg)
![Page 76: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/76.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Rotate the jar canvas.rotate(-30.0f, pX, pY); // Keep the jellybeans canvas.clipRect(l, t, r, b); // Draw the jar canvas.drawBitmap(mJellyBeans, x, y, null);}
![Page 77: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/77.jpg)
![Page 78: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/78.jpg)
1. Rotate
![Page 79: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/79.jpg)
2. Clip
![Page 80: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/80.jpg)
3. Draw
![Page 81: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/81.jpg)
![Page 82: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/82.jpg)
Sten
cil buf
fer
![Page 83: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/83.jpg)
Sten
cil buf
fer
![Page 84: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/84.jpg)
640 px
400
px
View
![Page 85: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/85.jpg)
Invalidate
640 px
400
px
(170,125)
(470,275)
![Page 86: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/86.jpg)
@Overrideprotected void onDraw(Canvas canvas) { // Query the current clip Rect clip = canvas.getClipBounds(); // ??? Log.d("I/O", "clip = " + clip);}
![Page 87: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/87.jpg)
![Page 88: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/88.jpg)
With hardware rendering0, 0, 640, 400(bounds of the View)
![Page 89: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/89.jpg)
With hardware rendering
With software rendering
0, 0, 640, 400
170,125, 470, 275
(bounds of the View)
(bounds of the dirty rect)
![Page 90: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/90.jpg)
Reordering barriers
![Page 91: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/91.jpg)
Non-rectangular clips
![Page 92: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/92.jpg)
saveLayer()
![Page 93: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/93.jpg)
More infoParleys.com
For Butter or WorseGoogle I/O 2012
Various Android GUI & performance talks
Accelerated Android RenderingGoogle I/O 2011
![Page 94: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/94.jpg)
More infoRomain’s Tips & Trickswww.curious-creature.org
Chet’s Tips & Tricks
goo.gl/y9JZrAndroid Performance Case Study
graphics-geek.blogspot.com
![Page 95: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/95.jpg)
Q&Agoogle.com/+ChetHaasegoogle.com/+RomainGuy
@chethaase@romainguy
![Page 96: Google I/O 2013 - Android Graphics Performance](https://reader033.vdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/96.jpg)
Developers