Оптимизация производительности пользовательского маркера с помощью 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)")
    }
}