我通过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?他们是怎么做到的?我认为您应该搜索绘图优化...