性能优化 -- 优化SurfaceView的线程调用

本文探讨了如何优化SurfaceView的线程调用,避免资源浪费。通过使用HandlerThread替代普通线程,实现线程在无任务时挂起,减少系统资源消耗。当有刷新请求时,HandlerThread能快速响应,避免视图卡顿。同时,文章提出了在多个SurfaceView场景下,如何共用同一个HandlerThread以进一步优化性能,并提到了防止Handler引发内存泄漏的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

性能优化 – 优化SurfaceView的线程调用

目录

SurfaceView的基本用法

SurfaceView是一个适用于频繁的刷新布局的View,可以在非主线程中刷新View,其基本用法如下

创建实例对象

SurfaceView mSurfaceView = new SurfaceView(this);
setContentView(mSurfaceView);

添加SurfaceHolder.Callback

mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
});

在Surface创建改变和销毁时会调用此回调

一般会在surfaceCreated方法中启用一个线程,然后借用这个线程来刷新View

mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {

    private boolean destroy = false;

    @Override
    public void surfaceCreated(final SurfaceHolder holder) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!destroy) {
                    Canvas canvas = holder.lockCanvas();
                    onDraw(canvas);
                    holder.unlockCanvasAndPost(canvas);
                }
            }
        });
        thread.start();
    }

    private void onDraw(Canvas canvas) {
        canvas.drawColor(Color.GREEN);
        //.......................在此做对View的绘制操作
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        destroy = true;
    }
});

首先借用new Thread创建一个线程,然后用一个变量destroy来标记SurfaceView的状态,借助destroy来控制线程的启停.

然后在线程中通过holder.lockCanvas()获得画布对象canvas,通过holder.unlockCanvasAndPost(canvas)释放和发送canvas对象来刷新布局.

值得注意的是用以上方法获得的Canvas对象是之前留下来的,所以如果没有需要保留上次绘制的情况下,需要调用canvas.drawColor()来执行一次清屏操作.

问题

基本用法介绍完了,那么思考个问题,上面创建了一个线程,几乎是死循环,就算没有新视图的刷新,线程还是一直在运行,这样是对系统资源的一种浪费,那么该如何优化线程的使用呢?

加延时吗?

加延时的化,Android屏幕的刷新时间是16ms,如果超过这个时间,便会有卡顿的感觉,也就是说加延时的话最多在每次循环里加16ms.

每次延时16ms,在一般情况下有点杯水车薪的感觉,然后有时候也可能有

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值