Google I/O 2013 - Android Graphics Performance
-
Upload
douo -
Category
Technology
-
view
336 -
download
1
description
Transcript of Google I/O 2013 - Android Graphics Performance
![Page 1: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/1.jpg)
![Page 2: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/2.jpg)
![Page 3: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/3.jpg)
&Graphics Performance
![Page 4: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/4.jpg)
&Chet Haase Romain Guy
![Page 5: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/5.jpg)
Architecture1
![Page 6: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/6.jpg)
Reordering & merging
![Page 7: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/8.jpg)
![Page 9: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/12.jpg)
![Page 13: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/13.jpg)
Multi-threading
![Page 14: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/14.jpg)
![Page 15: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/15.jpg)
Drawing
![Page 16: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/18.jpg)
Non-rectangular clipping
![Page 19: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/20.jpg)
Developer Tools2
![Page 21: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/21.jpg)
Overdraw
![Page 22: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/22.jpg)
Overdraw
![Page 23: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/23.jpg)
Overdraw
![Page 24: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/24.jpg)
OverdrawBlueGreenRedDeep Red
1x2x3x4x
![Page 25: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/26.jpg)
![Page 27: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/27.jpg)
![Page 28: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/30.jpg)
![Page 31: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/33.jpg)
Tips & Tricks3
![Page 34: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/34.jpg)
Overdraw demo
![Page 35: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/35.jpg)
Trilinear filtering
![Page 36: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/36.jpg)
![Page 37: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/37.jpg)
Off On
![Page 38: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/40.jpg)
Canvas layers
![Page 41: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/42.jpg)
saveLayer()
![Page 43: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/43.jpg)
![Page 44: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/44.jpg)
![Page 45: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/46.jpg)
saveLayer()
![Page 47: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/47.jpg)
![Page 48: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/48.jpg)
![Page 49: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/49.jpg)
Using alpha with care
![Page 50: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/50.jpg)
![Page 51: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/53.jpg)
![Page 54: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/54.jpg)
![Page 55: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/55.jpg)
![Page 56: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/56.jpg)
![Page 57: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/57.jpg)
lternatives
![Page 58: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/66.jpg)
![Page 67: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/69.jpg)
✂Clipping
![Page 70: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/71.jpg)
![Page 72: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/72.jpg)
1. Clip
![Page 73: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/73.jpg)
2. Rotate
![Page 74: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/74.jpg)
3. Draw
![Page 75: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/75.jpg)
![Page 76: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/77.jpg)
![Page 78: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/78.jpg)
1. Rotate
![Page 79: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/79.jpg)
2. Clip
![Page 80: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/80.jpg)
3. Draw
![Page 81: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/81.jpg)
![Page 82: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/82.jpg)
Sten
cil buf
fer
![Page 83: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/83.jpg)
Sten
cil buf
fer
![Page 84: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/87.jpg)
![Page 88: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/90.jpg)
Reordering barriers
![Page 91: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/91.jpg)
Non-rectangular clips
![Page 92: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/92.jpg)
saveLayer()
![Page 93: Google I/O 2013 - Android Graphics Performance](https://reader033.fdocuments.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.fdocuments.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.fdocuments.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.fdocuments.us/reader033/viewer/2022052323/558a1ff3d8b42ad3448b465a/html5/thumbnails/96.jpg)
Developers