2017-01-31 1 views
3

В моем приложении на данный момент на карту нарисована «сетка», рисуя каждый квадрат многоугольника один за другим и заполняя его цветом. Затем я добавляю объект многоугольника к карте, чтобы изменить позже, если нужно.Слишком много (потенциально 10 000+) нарисованных многоугольников отстающих карт Google

Я только создаю каждый многоугольник один раз, однако существует большая согласованная «лага» и низкая частота кадров, чем больше я добавляю (десятки тысяч потенциально), в конечном итоге разбивая приложение.

Вот текущая часть кода, которая создает и добавляет каждый квадрат к хэш-карте.

double latScale = 0.000180; 
double lngScale = 0.000288; 

PolygonOptions po = new PolygonOptions() 
     .add( new LatLng(lat, lng), 
       new LatLng(lat, lng + lngScale), 
       new LatLng(lat - latScale, lng + lngScale), 
       new LatLng(lat - latScale, lng)) 
     .strokeWidth(3f) 
     .strokeColor(Color.argb(220, 0, 0, 0)); 

if (colors.containsKey(color)){ 
    po.fillColor(colors.get(color)); 
} 
else{ 
    po.fillColor(colors.get("default")); 
} 

gridSquares.put(square_id, mMap.addPolygon(po)); 

Мой вопрос, что именно вызывает это отставание так много (я понимаю, что это должно быть само количество, но мне нужна конкретика, заново рисовать каждый кадр? Памяти?) И как я мог выполнить свою потребность для этого гигантского сетчатого оверлея каким-то образом, который не так сильно отстает. Либо с моим нынешним мышлением, либо по-новому.

Если необходимо уточнить пожалуйста, обратитесь.

+3

Это проблемы с рисованием, при этом рендеринг 10k + каждый кадр вызывает лаг. Сделайте только что-то, что вы можете увидеть на экране. –

+0

@Rod_Algonquin Что делать, если мне нужно/нужно иметь сетку с потенциально 10k + квадратами? – SamC

+0

Затем вы можете группировать/группировать их, и как только вы увеличиваете масштаб, вы рисуете все, что видите. –

ответ

1

То, что я в конечном итоге делает который работал очень хорошо был

  1. Использование GroundOverlay в картах Google для каждого полигона мне нужно, используя небольшое разрешение изображения (30x30, однако, если вам нужен только один цвет, это может быть 1x1) для каждого многоугольника, а не для рисования каждого. Это улучшило производительность на тонну.

  2. Позвоните в OnCameraIdleListener, чтобы каждый объект GroundOverlay был либо видимым, либо невидимым в зависимости от того, был ли он в связи с экраном в этой точке. Я закончил тем, что использовал небольшую буферную зону вокруг экрана, чтобы сделать наложения видимыми и в этой области.

0

Я думаю, вы должны начать с пользовательского поставщика плитки.

я написал что-то вроде, что на основе этого поста:

Google Maps API v2 draw part of circle on MapFragment

При таком подходе отображая около 1000 полилинии на карте гладкая.

+0

Мне нужно динамически менять каждый квадрат, поэтому я не думаю, что это сработает. – SamC