性能问题onDraw需要很长时间

时间:2014-02-12 22:14:19

标签: java android performance drawing rendering

我通过画布onDraw()绘制了大约5000行。我在视图中平移和缩放,因此onDraw被调用很多来绘制5000行。 我用SystemClock.uptimeMillis();测量了毫秒,而onDraw用evey调用35毫秒,这只是为了减缓。 在缩放时,我实际上可以看到它跳跃......

我已经将hardwareAcceleration设置为true,但没有改变任何内容。我认为for循环可能会减慢获取值。

以下代码需要很长时间:

    // Plot all lines on the view
    for (int i = 0; i < count; i++) {
        canvas.drawLine(line[i].getPktStart().getX(),
                line[i].getPktStart().getY(), line[i]
                        .getPktEnd().getX(), line[i]
                        .getPktEnd().getY(), lineColor);
    }

值“count”大约是5000。 line对象只是一个包含行的起点和终点的X和Y的类。

你有什么建议让它跑得更快吗?是因为阵列太大了吗?我认为5000值不应该是一个问题...

提前致谢。

3 个答案:

答案 0 :(得分:0)

您是否尝试过使用Path对象? 您是否尝试在对象中使用浮动以避免在绘制时进行类型转换?

我没有在Android上绘制CAD的经验,但是当我在桌面或android上使用这样的程序时,我注意到当你拖动某些东西时,图像保持不变。因此,您需要调查一下代码,这些代码可以将绘图保存到缓存(位图),而不是每次onDraw调用都使用绘制线5K次。此外,我认为您已经知道,当您放大/缩小某些图层时,如果它们不代表该图层的有意义信息,则不应该可见。你有没有为Android寻找AutoCAD?他们是如何做到的呢?我认为你应该寻找绘图优化......

答案 1 :(得分:0)

35毫秒转换为每秒约30帧。

我一直在做的是绘制内存位图,然后将其块传输到窗口。 首先,它在线条绘制过程中可能会更快,因为它不会对重叠窗口进行裁剪。 其次,块传输发生得如此之快,以至于瞬间出现。

这样,即使实际上它也没有快速绘画。 如果你直接在窗户上画画,它会比闪光灯更好。

以下是我在C#中的表现:

    Graphics grToDrawOn = null;
    Bitmap bmToDrawOn = null;
    private void MyWin_Paint(object sender, PaintEventArgs _e){
        int w = ClientRectangle.Width;
        int h = ClientRectangle.Height;
        Graphics gr = _e.Graphics;
        // if the bitmap needs to be made, do so
        if (bmToDrawOn == null) bmToDrawOn = new Bitmap(w, h, gr);
        // if the bitmap needs to be changed in size, do so
        if (bmToDrawOn.Width != w || bmToDrawOn.Height != h){
            bmToDrawOn = new Bitmap(w, h, gr);
        }
        // hook the bitmap into the graphics object
        grToDrawOn = Graphics.FromImage(bmToDrawOn);
        // clear the graphics object before drawing
        grToDrawOn.Clear(Color.White);
        // paint everything on grToDrawOn
        DoPainting();
        // copy the bitmap onto the real screen
        _e.Graphics.DrawImage(bmToDrawOn, new Point(0,0));
    }

答案 2 :(得分:0)

我添加了一行代码,现在它至少可以运行5k点。

这是我添加的内容:this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

多数民众赞成! =)