我通过画布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值不应该是一个问题...
提前致谢。
答案 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);
多数民众赞成! =)