Java 性能问题onDraw需要很长时间
我通过canvas onDraw()在视图上绘制了大约5000条线。我在视图中平移和缩放,因此onDraw被调用很多来绘制5000条线。 我确实用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
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));
}