为什么这个Android代码这么慢?

时间:2015-03-16 18:36:25

标签: java android performance canvas

我有一个轮廓图渲染程序,它快速炽热。它基本上渲染到OnPaint事件中的一个表单,并且非常快速地更新...基本上和移动鼠标一样快。我很高兴。它基于这篇论文:

http://paulbourke.net/papers/conrec/

然而,我把它移植到Android / Java并且针对一个非常快的平板电脑(Nexus 9)而且它的速度非常慢,我觉得我必须使用错误的方法。基本上我:

1)以编程方式创建视图, 2)实现onDraw方法来调用我的cContourPlot类的Draw方法,其中 3)迭代2-D数据阵列,比较1-D" bins"数组,并对" DrawPolygonRegion"进行几千次调用。我在下面写的功能。

这需要花费相当长的时间,比.NET慢大约100倍,直到我想知道我是否做错了。具体问题:

a)功能是否低于速度可调?绘制多边形比使用Path更快吗? (在.NET中有一个DrawPolygon函数,不得不为Android端口创建新东西) b)我是否需要做一些事情"批次"我的渲染命令?如(想象:) Canvas.SuspendUpdates,Canvas.ResumeUpdates? c)我需要激活双缓冲还是什么?我的快速研究表明,这是在Android中自动完成的,但不确定。 (我不得不在.NET中激活它,但不确定我是否必须在这里)

非常感谢您提供任何见解/帮助。

void DrawPolygonRegion(Canvas c, int color, double ... p)
{
    int length = p.length;

    if (length >= 6)
    {
        paint.setColor(color);
        paint.setStyle(Style.FILL);
        Path path = new Path();
        path.moveTo((float) p[0], (float) p[1]); // used for first point
        path.lineTo((float) p[2], (float) p[3]);
        path.lineTo((float) p[4], (float) p[5]);

        int idx = 6;

        for (int n=6; n<length; n+=2)
        {
            path.lineTo((float) p[n], (float) p[n+1]);
        }

        c.drawPath(path, paint);
    }
}

1 个答案:

答案 0 :(得分:4)

召唤这几千次。哦,是的,你遇到了一些问题。

1)它分配一个新路径。分配在Android上迅速增加。尽量避免它们。更喜欢重用对象,特别是在像onDraw这样的函数中。

2)你真的不应该一直创造整个路径 - 他们最好保存并在追加模式下重复使用。

3)从double到float的向下转换不是免费的。避免它

4)你是直接在屏幕画布上做的吗?唐&#39;吨。在自己的线程中对位图画布执行此操作,并将结果blit到屏幕画布。

我真的怀疑这个代码在具有更好处理器和RAM的PC上即使在.NET中也非常快速。我认为你的屁股是通过硬件加速来拯救的。