2014-08-28 8 views
14

Ich habe das Google Maps für iOS-SDK kürzlich in eine iOS-App integriert. Diese App wurde entwickelt, um die Position von Flugzeugen (einschließlich Flugzeugmodell, lat/lng, Geschwindigkeit - Basiswerte für ein Flugzeug) abzurufen und dann auf einer Google Map zu plotten.Optimierung der benutzerdefinierten Marker-Image-Leistung mit dem Google Maps SDK für iOS

Jetzt hat sich die Anzahl der Flugzeuge, die die API (die ich benutze) zurückgibt, verdoppelt, fast verdreifacht. Ich hatte keine Probleme, bevor noch jedes Mal, wenn ich versuche, die App zu laufen, stürzt es, mir die folgende Fehlermeldung geben:

((null)) was false: Reached the max number of texture atlases, can not allocate more. 

ich dieses Problem Seite auf Google Code für das SDK gefunden: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5756 - hier ist ich gemacht zu glauben, dass das Problem mit meinem Absturz auf die Anzahl der benutzerdefinierten Markerbilder zurückzuführen ist, die ich verwende. Jedes Flugzeugmodell hat ein anderes Bild, und diese werden geladen, wenn sie gerendert werden, und einem GMSMarker wird ein U-Bild zugewiesen.

Nun, das Problem, das ich habe, ist mit einer großen Menge von Ergebnissen, ich bekomme diesen Absturz. Gleichzeitig möchte ich auch individuelle Bilder für jeden Marker haben.

Meine Frage ist, gibt es eine Möglichkeit, anstatt jedem Marker ein UIImage eines bestimmten Flugzeugs zuzuweisen, kann ich einmal auf jedes Bild verweisen, um die Leistung zu optimieren?

Ich schätze Ihre Hilfe, bitte lassen Sie mich wissen, wenn ich mich nicht klar gemacht habe!

Antwort

15

Ich beantworte meine eigene Frage, nachdem ich erneut auf das Problem gestoßen bin.

Das Problem scheint zu sein, dass ich eine separate UIImage-Instanz für jeden Marker zuweisen. Das bedeutet, dass beim Zeichnen von Markern auf der GMSMapView-Instanz jeder Marker über ein separates UII-Bild verfügt. Dies wird hier kurz beschrieben: Customize the marker image - Google Maps SDK for iOS.

If you are creating several markers with the same image, use the same instance of UIImage for each of the markers. This helps improve the performance of your application when displaying many markers.

ich durch eine Liste von Objekten wurde Iterieren jeden Marker zu erstellen:

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_; 
} 

Also hier war ich auf jeden Marker das Bild zu kopieren. Das hat mehr Ressourcen beansprucht als nötig. Die Lösung für mich:

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_; 
} 

Definition der UIImage-Instanz außerhalb der for-Schleife bedeutet, dass das Bild von jeder Markierung verwiesen wurde, nicht für jeden Marker neu gerendert. Die Speichernutzung war danach viel niedriger.

0

Meine Lösung; ((null)) war falsch: Die maximale Anzahl an Texturatlanten wurde erreicht, mehr kann nicht zugewiesen werden.

Beim Erstellen der Markierungen behalten Sie Ortsinformationen aus dem Thread.

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)") 
    } 
} 
+0

Bitte klären Sie die Antwort, wenn Sie sagen "Halten Sie Ortsinformationen aus dem Thread", meinst du aus der for-Schleife? – Efren

+0

Nein, Struktur auf der for-Schleife. –

Verwandte Themen