- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从事一个项目,该项目正在启动绘制道路并显示有关道路的一些信息。问题是我使用了太多的地理点(5.000-10.000 +)并画线点到点并用不同的颜色显示道路,所以 map 太慢了。我做了一些关于我的配置应用程序,但仍然太慢。您对解决我的问题并提高性能有什么想法吗?
这是我的代码。
for (int t = 0; t < roads.size(); t++) {
for (int i = 0; i < roads.get(t).size() - 1; i++) {
//bounds up-bottom-right-left to draw roads
if (boundBox[0] >= roads.get(t).get(i)
.getLatitudeE6()
&& boundBox[1] >= roads.get(t).get(i)
.getLongitudeE6()
&& boundBox[2] <= roads.get(t).get(i)
.getLatitudeE6()
&& boundBox[3] <= roads.get(t).get(i)
.getLongitudeE6()) {
MyOverlay mOverlay = new MyOverlay();
mOverlay.setColor(Color.GREEN);
mOverlay.setWidth(4);
mOverlay.setPair(roads.get(t).get(i),
roads.get(t).get(i + 1));
mapOverlays.add(mOverlay);
}
}
}
class MyOverlay extends Overlay {
GeoPoint gp1 = new GeoPoint(0, 0);
GeoPoint gp2 = new GeoPoint(0, 0);
int colr=0,width=0;
public MyOverlay() {
}
public void draw(Canvas canvas, MapView mapv, boolean shadow) {
super.draw(canvas, mapv, false);
Paint mPaint = new Paint();
mPaint.setDither(true);
mPaint.setColor(colr);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(width);
Point p1 = new Point();
Point p2 = new Point();
Path path = new Path();
Projection projection = mapv.getProjection();
projection.toPixels(gp1, p1);
projection.toPixels(gp2, p2);
path.moveTo((float) p2.x, (float) p2.y);
path.lineTo((float) p1.x, (float) p1.y);
// canvas.drawBitmap(markerBitmap, point.x, point.y, null);
canvas.drawPath(path, mPaint);
//canvas.drawBitmap(bitmap, src, dst, paint);
}
public void setPair(GeoPoint gpone, GeoPoint gptwo) {
gp1 = gpone;
gp2 = gptwo;
}
public void setColor(int clr)
{
colr=clr;
}
public void setWidth(int w)
{
width=w;
}
}
有人能解决我的问题吗?
最佳答案
您可以采取一些措施来提高效率。
您的第一个代码块可以稍微更有效率:
for (int t = 0, size = roads.size(); t < size; t++) { //Avoid calling '.size()' over and over
for (int i = 0; i < roads.get(t).size() - 1; i++) {//Avoid calling '.size()' over and over
final GeoPoint road = roads.get(t).get(i); //Reduce the number of get() calls.
if (boundBox[0] >= road.getLatitudeE6()
&& boundBox[1] >= road.getLongitudeE6()
&& boundBox[2] <= road.getLatitudeE6()
&& boundBox[3] <= road.getLongitudeE6()) {
MyOverlay mOverlay = new MyOverlay();
mOverlay.setColor(Color.GREEN);
mOverlay.setWidth(4);
mOverlay.setPair(road, roads.get(t).get(i + 1));
mapOverlays.add(mOverlay);
}
}
}
但最重要的是,我在您的代码中看到的最大性能消耗是每次调用 draw() 时您都在分配新的渲染对象(Paint、Path、Point)。这可以重构,因此您可以重用相同的 Paint 实例:
class MyOverlay extends Overlay {
GeoPoint gp1 = new GeoPoint(0, 0);
GeoPoint gp2 = new GeoPoint(0, 0);
Point p1 = new Point();
Point p2 = new Point();
Path path = new Path();
int colr=0,width=0;
public MyOverlay() {
Paint mPaint = new Paint();
mPaint.setDither(true);
mPaint.setColor(colr);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(width);
}
public void draw(Canvas canvas, MapView mapv, boolean shadow) {
super.draw(canvas, mapv, false);
path.reset();
Projection projection = mapv.getProjection();
projection.toPixels(gp1, p1);
projection.toPixels(gp2, p2);
path.moveTo((float) p2.x, (float) p2.y);
path.lineTo((float) p1.x, (float) p1.y);
canvas.drawPath(path, mPaint);
}
}
有关更多信息,请参阅此处文章的“注意事项”部分:http://android-developers.blogspot.com.au/2011/03/android-30-hardware-acceleration.html .
文章的相关要点是:“不要在绘制方法中创建渲染对象:一个常见的错误是每次调用渲染方法时都创建一个新的 Paint 或一个新的 Path。这是不仅浪费,迫使系统更频繁地运行 GC,还绕过了硬件管道中的缓存和优化。”
关于Android 谷歌地图绘制道路性能问题 10.000+ 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9729951/
我正在制作一个基于网格的游戏。 在这个游戏中,您可以放置建筑物、墙壁和道路。 当某些东西被放置在网格中时,我将单元格 ID 设置为该对象 ID。到目前为止一切顺利,一切正常。 当我需要时,我的问题
我想创建一个交互式 map ,其中道路等的样式为我想要的颜色。现在,我了解了 Mapbox,但这不是我们想要使用的,因为最终它会因为费用而花费我们很多钱。 我一直在互联网上寻找替代方案。我发现了很多拼
我正在尝试用 Java 制作一个正则表达式,它可以粗略地用于匹配某些街道名称。我想这样做,以便给定以下字符串: Then someone decided to go to the high stree
尝试用颜色“标记”一个区域并在该区域放置一个数字: 我在这里说明了它: 数字是静态的,不会改变。 区域标记假设会改变颜色。并且区域标记假设使用周围的街道/道路包围该区域(不仅仅是简单的圆形图) 我会尝
我需要能够使用 V2 或 V3(最好是 3)创建在某种意义上忽略建筑物的路径。 我什至试图创建一个 kml 文件来自己绘制所有路径,然后找到一些方法根据需要打开/关闭它们。 例如。用户想从 A 点到
我在 http://www.41latitude.com/post/1268734799/google-styled-maps 上找到了一个代码片段: [ { featureType: "
我正在使用 Roads Google API 传递一个位置列表,我想根据这些点在最有可能由汽车行驶的道路上画线。 有些地方出了问题,因为有些点没有被线穿过,而且这些线不仅仅使用道路,有些点通过直线穿过
我们如何使用切换按钮在 Mapbox gl js 中突出显示(更改颜色)道路、人行道或自行车道? 最佳答案 您可以使用setPaintProperty更改图层的填充颜色,就像在官方 Mapbox 示例
我正在尝试在道路上绘制一条路径并遵循一些给定的点。我正在使用 Google Directions API 来遵循道路。我在道路上放置了一些标记并将这些点与折线连接起来。我需要遵循红线但是它跟随并绘制蓝
我是一名优秀的程序员,十分优秀!