Java 性能问题onDraw需要很长时间

Java 性能问题onDraw需要很长时间,java,android,performance,drawing,rendering,Java,Android,Performance,Drawing,Rendering,我通过canvas onDraw()在视图上绘制了大约5000条线。我在视图中平移和缩放,因此onDraw被调用很多来绘制5000条线。 我确实用SystemClock.uptimeMillis()测量了毫秒数和onDraw通话35毫秒,每次通话都很慢。 放大的时候,我可以看到它在跳 我已经将硬件加速设置为真,但这并没有改变任何事情。我认为for循环可能会导致获取值的速度变慢 下面是需要很长时间的代码: // Plot all lines on the view for (int

我通过canvas onDraw()在视图上绘制了大约5000条线。我在视图中平移和缩放,因此onDraw被调用很多来绘制5000条线。 我确实用
SystemClock.uptimeMillis()测量了毫秒数
和onDraw通话35毫秒,每次通话都很慢。 放大的时候,我可以看到它在跳

我已经将硬件加速设置为真,但这并没有改变任何事情。我认为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);
    }
//在视图上绘制所有线
for(int i=0;i
“count”值约为5000。 line对象只是一个类,它包含直线起点和终点的X和Y

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


提前感谢。

您是否尝试使用路径对象? 您是否也尝试过在对象中使用浮动来避免绘制对象时的类型转换


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

35毫秒转换为每秒约30帧

我经常做的是绘制内存位图,然后将其块传输到窗口。 首先,在绘制线条时,它可能会更快,因为它不会对重叠窗口进行剪裁。 第二,块传输发生得如此之快,以至于看起来是瞬时的

这样,即使它不是真的,它看起来也画得很快。 如果你直接在窗户上画画,这比你得到的闪光要好得多

以下是我在C#中的做法:


嗯,我添加了一行代码,现在它至少可以运行5公里

下面是我添加的内容:
this.setLayerType(View.LAYER\u TYPE\u软件,null)


就这样

我需要绘制实际的线条,还是路径ans更快?我可能会尝试摆脱castingOkay,因为我将线条对象更改为具有浮点,这样做的时间大约为1-2毫秒。在onDraw中仍然有大约33毫秒,这只是为了减慢速度……也许你做错了什么?典型的屏幕是从800x480到1920x1080,为什么你需要画5K的线,这些线不适合屏幕,或者看起来会被干扰…我正在读一个建筑图纸的dxf文件。我需要太多的缩放和平移,就像你在CAD程序中所做的那样。这些画有很多线条,我需要展示。我注意到,当我放大到像100000这样的scalefactor时,实际性能会更好,尽管我仍然绘制了所有5k线。问题可能是渲染而不是实际的onDraw。当我开始拖动时,GPU会变得疯狂。非常奇怪的是,它在我的小Galaxy s2上运行得更好,而不是在nexus 7上。嘿,迈克,我只是从这个东西开始。。你能给我一个例子的链接或者一些小的例子代码吗?我目前正在使用矩阵对象转换所有内容,需要跟踪平移和缩放,以便在平移后保持原始坐标。这是位图的问题吗?@GeoGecco:我不是一个Javista,但我只是展示了我如何在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));
    }