2012-10-16 4 views
4

iOS 6으로 업데이트 한 후 다중 오버레이가있는 MKMapView를 패닝하거나 확대/축소 할 때 성능이 저하되는 것을 확인했습니다. 내가 만든 앱에는 다양한 색상의 폴리곤 오버레이가 약 600 개 있고 iOS 5에서 오래된 iOS 기기에서도 지연이 발생하지 않고 iOS 6에서 심지어 최신 기기에서도 매우 느리게 실행됩니다 (확대/축소시 & 패닝).iOS6의 MapKit 성능 문제

내 직감은 이것이 화면에 타일을 표시하는 대신 실제로 벡터를 기반으로 맵을 동적으로 만들어야한다는 사실에 기인합니다.

지도를 패닝하거나 확대/축소 할 때 경험 한 지연을 줄이기위한 아이디어가 있습니까?

오버레이가 화면에 전혀 표시되지 않는 영역을 확대/축소하거나 패닝하는 동안이 낮은 프레임 속도가 발생하므로 오버레이가 화면 상에 나타날 때 오버레이를 만들지 않아도됩니다.

+0

계측기의 성능 문제를 프로필 했습니까? – Felix

+0

어떻게 테스트하면 좋을까요? 어떤 악기를 사용해야합니까? –

+0

시간 프로파일 러를 사용하십시오 (문제가 cpu 바운드 인 경우) - 코드에서 가장 많은 시간이 소비되는 곳을 보여줍니다. – Felix

답변

1

모든 오버레이를 하나로 결합 해 볼 수 있습니다. 이로 인해 성능이 크게 향상 될 수 있습니다.

아이디어는 모든 다각형을 포함하는 경계 상자로 오버레이를 만드는 것입니다. 이렇게하면 mapView: viewForOverlay이 항상 호출됩니다. 모든 다각형을 포함하는 오버레이의 속성을 만듭니다. 그런 다음 오버레이보기의 drawMapRect: 메소드에서 모든 폴리곤에 mapRect 교차점을 테스트하고 필요한 경우 그려줍니다. 스크린 밖의 다각형을 그리지 않으려 고하므로 이는 중요합니다.

이 전략은 Apple의 자체 MapKit 예제 프로젝트를 기반으로합니다. 하나의 MKOverlayView 여러 그리기 개체의 예를 들어 HazardMap을 확인하고 효율적으로

0

내가 최소한의 MapKit 기술 데모를 가지고있는 drawMapRect 방법에 현재 mapRect와 교차로에 대한 다각형을 테스트하는 방법의 예를 들어 BreadCrumb을 확인하고이다 iOS6를 탑재 한 iPad 3에서 실행하면 눈에 띄게 지연됩니다. 프로파일 링은 CPU에 묶여 있음을 보여 주지만 0.2 % 만 내 코드에서 나온 것입니다. 제 경우의 큰 원인은 도로를 렌더링하고 렌더링 레이블을 붙이는 것입니다. 둘 다 MapKit에서 수행합니다. 샌프란시스코 시내를 5KM 규모로 보여주기 때문에 렌더링 할 도로와 라벨이 많이 있습니다.

그래서 이야기의 도덕은 다음과 같습니다. iOS6 맵은 SLOW입니다. 하지만 이것이 iOS5 나 iPad 2와 어떻게 비교되는지는 알 수 없습니다. 그러나 그것은 뒤쳐져 있으며, 나는 내 자신의 일을 간신히하고 있습니다.

P.S. : 계기를 열고 Time Profiler를 사용하십시오. 기록을 작성하고 드릴 다운하여 범인을 찾으십시오. 그런 다음 '시스템 라이브러리 숨기기'를 선택하여 래그가 자신의 책임과 MapKit의 차이점을 확인하십시오. 그런 다음 필요에 따라 최적화하십시오.