• View优化


    前面写了个View画圆弧,为了让他和底层图片效果融合,采用先把圆弧画到和图片一样大小的画布上,然后用canvas的变换位图方法映射过去。

            bitmapWithReflection = Bitmap.createBitmap(swidth, sheight, Config.ARGB_8888);
            canvas_bm = new Canvas(bitmapWithReflection);
            canvas_bm.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, deafaultPaint); // 绘制进度圆弧,这里是蓝色
            canvas.drawBitmap(bitmapWithReflection, new Rect(0, 0, swidth, sheight), rect, null);

    可是通过traceView分析到,ViewRootImpl.onDraw函数平均时间为72.808那是远大于16,卡是必然的,我们发现里面的自定义view的onDraw函数时间就达24ms之多,主要是在createBitmap和gc上耗时较大。

    跟踪ImageView的fill_center模式,发现他并没有耗时这么长,原来它直接用matrix对canvas进行变换,省去了上述两个最耗时的操作。

            canvas.save();
            matrix = new Matrix();
            matrix.setRectToRect(oval_src, rect, ScaleToFit.CENTER);
            canvas.concat(matrix);
            canvas.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, deafaultPaint); // 绘制进度圆弧,这里是蓝色
            canvas.restore();

    这里的自定义view ondraw函数时间不到1ms减小了很多,目前RootView时间为48ms,还是卡,有待进一步优化。

    后续:

    整了一下午,写了个测试程序,使用的属性动画,底层可以看到是调用openGL的交换缓冲区实现,onDraw控制在14毫秒左右;

    可我自己的程序删减得代码都一样了,底层始终在调imageView的draw bitmap,它的时间就在30秒以上,那个伤心呀。

    后面准备把测试程序的activity弄过来一步一步加看到底怎么回事,弄过来才发现,好好的代码时间也在30毫秒以上了。

    看AndroidManifest.xml发现一个是sdk 11一个是14,修改过来,现在的时间在21毫秒了,效果还是有提过的,离16毫秒越来越近了。

  • 相关阅读:
    golang的time包
    golang的defer
    vscode出现卡在setting up workspace loading packages问题
    golang的module管理与使用go mod
    vscode常见插件及使用
    vscode的settings.json配置文件
    vscode的launch.json配置文件
    vscode搭建golang环境
    MacBook初使用
    Git-错误汇总
  • 原文地址:https://www.cnblogs.com/Empenguin/p/3713602.html
Copyright © 2020-2023  润新知