SurfaceView双缓冲测试

来源:互联网 发布:赤月传说2进阶数据 编辑:程序博客网 时间:2024/05/16 14:09

这是在进行SurfaceView脏矩形绘制研究之前的一个小测试。


安卓SurfaceView主要在工作线程中更新视图,使用双缓冲机制。

因为绘制到设备的时间远小于保存到内存的时间,所以把所有图元统一绘制到内存,然后再统一绘制到设备,能够优化显示速度。


找了一些SurfaceView的资料,意思大概如下:

绘制第一帧使用buffer1,当unlock之后,绘制buffer1到设备,

绘制第二帧使用buffer2,unlock之后绘制buffer2到设备,

绘制第三帧使用buffer1,

如此循环。。。


写了测试代码:

public class DirtyRectActivity extends BaseActivity implements SurfaceHolder.Callback{private SurfaceView mSurfaceView;private SurfaceHolder mSurfaceHolder;private WorkThread mThread = new WorkThread();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dirty_rect);mSurfaceView = (SurfaceView)findViewById(R.id.surface);mSurfaceHolder = mSurfaceView.getHolder();        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        mSurfaceHolder.addCallback(this);}public class WorkThread extends Thread{private boolean mStop = false;private int mFrame = 0;public void run() {while (!interrupted() && !mStop) {try {sleep(1000);} catch (InterruptedException e) {}draw(mFrame++);}};public void stopThread(){mStop = true;try {join();} catch (InterruptedException e) {}}}private void draw(int frame){Paint paint = new Paint();paint.setColor(Color.parseColor("red"));paint.setTextSize(16f);Canvas canvas = null;        try {        canvas = mSurfaceHolder.lockCanvas();        String text = ""+frame;            canvas.drawText(text, 20*frame, 111, paint);        } catch (Exception e) {                } finally{            if (canvas != null){            try {            mSurfaceHolder.unlockCanvasAndPost(canvas);} catch (Exception e2) {}            }        }}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mThread.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mThread.stopThread();}}

执行效果:


这个是其中一个的效果。

在我手机上测试,效果是2帧交替使用,看来SurfaceView使用的buffer数目在不同设备上不是统一的。

0 0
原创粉丝点击