CPU(中央处理器)与GPU(图像处理器)android
主要是设计目标不一样,针对不一样的应用场景。多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计算操做。canvas
CPU擅长逻辑控制和通用类型数据运算。CPU的运算速度取决于请了多么厉害的教授,教授处理复杂任务的能力高,但简单重复的任务,仍是人多快。众核少缓存,适用于结构单一的数据处理,主要负责Rasterization(栅格化)操做。缓存
GPU擅长大规模并发计算。GPU的运算速度取决于雇了多少小学生。 bash
屏幕上显示的文字、图像等,都是经过屏幕上的像素点显示颜色来完成的。 并发
CPU负责把UI组件计算成Polygons,Texture纹理,而后交给GPU进行栅格化渲染。 整个流程以下ide
为了保证用户的视觉效果,因此Android系统每隔16ms(1000ms/60fps)发出VSYNC信号,触发对UI渲染。布局
若是渲染操做超过了16ms,那么用户在16ms * 2 看到的2帧画面相同,感受界面卡顿,即丢帧现象。优化
public class ClipView extends View {
Card[] cards;
Paint paint;
......
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Card card;
Bitmap bitmap;
for (int i = 0; i < cards.length - 1; i++) {
card = cards[i];
bitmap = BitmapFactory.decodeResource(getResources(), card.resId);
canvas.drawBitmap(bitmap, card.x, 0, paint);
// drawCards(canvas, bitmap, card.x, cards[i + 1].x);
}
card = cards[cards.length - 1];
bitmap = BitmapFactory.decodeResource(getResources(), card.resId);
canvas.drawBitmap(bitmap, card.x, 0, paint);
}
private void drawCards(Canvas canvas, Bitmap bitmap, int s, int e) {
canvas.save();
canvas.clipRect(s, 0, e, bitmap.getHeight());
canvas.drawBitmap(bitmap, s, 0, paint);
canvas.restore();
}
}
复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<com.outman.example.androidtest.clip.ClipView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000ff"
android:layout_margin="10dp"/>
</LinearLayout>
复制代码