2014-08-28 14 views
14

Gần đây tôi đã kết hợp SDK Google Maps cho iOS trong một ứng dụng iOS. Ứng dụng này được thiết kế để lấy vị trí của máy bay (bao gồm mô hình máy bay, lat/lng, tốc độ - giá trị cơ bản cho máy bay) và sau đó vẽ chúng trên Bản đồ Google.Tối ưu hóa hiệu suất hình ảnh điểm đánh dấu tùy chỉnh với Google Maps SDK cho iOS

Hiện tại, gần đây, số lượng máy bay mà API (cái tôi đang sử dụng) đang quay trở lại đã tăng gấp đôi, gần gấp ba lần. Tôi không có vấn đề trước khi chưa mỗi khi tôi cố gắng để chạy các ứng dụng, nó bị treo, đem lại cho tôi những lỗi sau:

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

Tôi tìm thấy trang vấn đề này trên Google Code để SDK: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5756 - ở đây, tôi đang làm để tin rằng vấn đề với sự cố của tôi giảm xuống số lượng hình ảnh đánh dấu tùy chỉnh mà tôi đang sử dụng. Mỗi mô hình máy bay có một hình ảnh khác nhau và chúng được tải khi chúng được hiển thị và một UII được gán cho GMSMarker.

Bây giờ, vấn đề tôi gặp phải với một lượng lớn kết quả, tôi gặp sự cố này. Đồng thời, tôi cũng muốn có hình ảnh riêng lẻ cho mỗi điểm đánh dấu.

Câu hỏi của tôi là, có cách thay vì chỉ định từng điểm đánh dấu một UIImage của một máy bay cụ thể, tôi có thể tham chiếu một lần cho mỗi hình ảnh để tối ưu hóa hiệu suất không?

Tôi đánh giá cao sự trợ giúp của bạn, vui lòng cho tôi biết nếu tôi chưa tự làm rõ!

Trả lời

15

Trả lời câu hỏi của riêng tôi sau khi gặp lại vấn đề.

Vấn đề có vẻ là tôi đang phân bổ một cá thể UIImage riêng biệt cho mỗi điểm đánh dấu. Điều này có nghĩa là khi tôi vẽ biểu đồ đánh dấu trên cá thể GMSMapView, mỗi điểm đánh dấu có một UIImage riêng biệt. Điều này được mô tả ngắn gọn tại đây: 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.

Tôi đã lặp lại thông qua một danh sách các đối tượng để tạo ra từng mốc:

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

Vì vậy, ở đây, tôi đã sao chép các hình ảnh cho mỗi điểm đánh dấu. Điều đó chiếm nhiều tài nguyên hơn mức cần thiết. Giải pháp cho tôi:

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

Xác định trường hợp UIImage bên ngoài vòng lặp có nghĩa là hình ảnh được tham chiếu từ mỗi điểm đánh dấu, không được hiển thị lại cho mỗi điểm đánh dấu. Sử dụng bộ nhớ thấp hơn nhiều sau này.

0

Giải quyết của tôi; ((null)) là sai: Đã đạt đến số lượng tối đa kết quả tập trung, không thể phân bổ nhiều hơn.

Bạn giữ thông tin vị trí trong chuỗi trong khi tạo điểm đánh dấu.

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

Hãy làm rõ câu trả lời, khi bạn nói "lưu thông tin vị trí ra khỏi chuỗi", bạn có ý nghĩa ngoài vòng lặp không? – Efren

+0

Không, Cấu trúc trên vòng lặp for. –

Các vấn đề liên quan