Оптимизация производительности пользовательского маркера с помощью SDK Google Maps для iOS
Недавно я включил SDK Google Maps для iOS в приложение iOS. Это приложение предназначено для извлечения позиции самолета (включая модель самолета, lat/lng, скорость - базовые значения для самолета), а затем для их построения на карте Google.
Теперь, недавно, количество самолетов, которые API (тот, который я использую) возвращается, удвоилось, почти утроилось. У меня не было никаких проблем до того, как каждый раз, когда я пытаюсь запустить приложение, он выходит из строя, давая мне следующую ошибку:
((null)) was false: Reached the max number of texture atlases, can not allocate more.
Я нашел эту страницу проблемы в Google Code для SDK: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5756 - здесь я убежден, что проблема с моим сбоем сводится к количество пользовательских изображений маркеров, которые я использую. Каждая модель самолета имеет другое изображение, и они загружаются по мере их рендеринга, а UIImage назначается GMSMarker.
Теперь у меня проблема с большим количеством результатов, я получаю этот крах. В то же время я также хочу иметь отдельные изображения для каждого маркера.
Мой вопрос заключается в том, что вместо того, чтобы назначать каждому маркеру UIImage конкретного самолета, могу ли я один раз ссылаться на каждое изображение для оптимизации производительности?
Я ценю вашу помощь, пожалуйста, дайте мне знать, если я не дал себе понять!
Ответы
Ответ 1
Отвечая на мой вопрос, снова повторив вопрос.
Проблема заключается в том, что я выделяю отдельный экземпляр UIImage для каждого маркера. Это означает, что когда я рисую маркеры в экземпляре GMSMapView, каждый маркер имеет отдельный UIImage. Это кратко описано здесь: Настроить изображение маркера - SDK Google Maps для iOS.
Если вы создаете несколько маркеров с одним и тем же изображением, используйте один и тот же экземпляр UIImage для каждого из маркеров. Это помогает повысить производительность вашего приложения при отображении многих маркеров.
Я повторял список объектов для создания каждого маркера:
for (int i = 0; i < [array count]; i++) {
UIImage *image = [UIImage imageWithContentsOfFile:@"image.png"];
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.title = @"Hello World";
marker.icon = image;
marker.map = mapView_;
}
Итак, здесь я копировал изображение на каждый маркер. Это заняло больше ресурсов, чем необходимо. Решение для меня:
UIImage *image = [UIImage imageWithContentsOfFile:@"image.png"];
for (int i = 0; i < [array count]; i++) {
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.title = @"Hello World";
marker.icon = image;
marker.map = mapView_;
}
Определение экземпляра UIImage вне цикла for-loop означает, что изображение ссылалось на каждый маркер, а не повторно отображалось для каждого маркера. После этого использование памяти было намного ниже.
Ответ 2
Мое решение; ((null)) было ложным: Достигнуто максимальное количество текстурных атласов, не может выделить больше.
Вы сохраняете информацию о местоположении из потока при создании маркеров.
OperationQueue.main.addOperation {
let coordinates = CLLocationCoordinate2D(latitude:LatData!, longitude: longData!)
let marker = GMSMarker(position: coordinates)
marker.icon = GMSMarker.markerImage(with: .blue)
for i in 0 ... self.DemandLong.count {
marker.infoWindowAnchor = CGPoint(x: 0, y: 5)
marker.map = self.MyExploreView
marker.accessibilityLabel = "\(i)" //Marker Label
print("Location Marker i:\(i)")
}
}