绘制上的性能问题需要很长时间



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

我已经将硬件加速设置为 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);
    }

值"计数"约为 5000。line 对象只是一个类,它保存线条的起点和终点的 X 和 Y。

你有什么办法让它运行得更快吗?是因为阵列太大吗?我认为 5000 个值应该不是问题......

提前谢谢。

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));
    }

好吧,我添加了一行代码,现在它至少可以正常工作 5k 点。

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

这就是它 ! =)

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

我没有在 android 上绘制 CAD 的经验,但是当我在桌面或 android 上使用此类程序时,我注意到当您拖动某些内容时,图像会保持静止。因此,您需要调查当时将绘图保存到缓存(位图)的代码,而不是在每次 onDraw 调用中使用 5K 次绘制线。另外,我想您已经知道,当您放大/缩小某些图层时,如果它们不代表该图层的有意义信息,则它们应该不可见。您是否正在寻找适用于安卓的AutoCAD?他们是怎么做到的?我认为您应该搜索绘图优化...

相关内容

最新更新