2011-10-05 5 views
1

내 iPad 응용 프로그램의 성능에이 문제가 있습니다.iPad 성능 문제

개발을 위해 쓰레기 수거를 담당하는 MonoDevelop를 사용합니다. 아직도 나의 질문은 오히려 일반적이다.

오케이, 저는 5 개의 NavigationController가있는 TabBarController를 사용합니다. nav 컨트롤러 내부에는 TableViews 또는 ScrollViews 뷰가있는 컨트롤러가 있습니다. 다음 아이는 항상 그냥보기입니다.

나는 몇 가지 질문이 있습니다

1) TableViews가 원활하게 이동하지 않습니다. 알파 투명도를 가지고 있지만, 프로그래밍 방식이 아닌 Photoshop에서 그래픽을 만들었으므로 이러한 투명성으로 인해 많은 문제가 발생하지 않습니다. 테이블에 결과가 거의 없거나 많은지는 중요하지 않습니다. 반면에, ScrollView는 같은 목적을 가지고 있습니다. 즉, 다른 레이아웃과 버튼을 가진 테이블이되어 Photoshop에서 투명도를 생성했습니다. 그것은 완벽하게 작동합니다.

테이블의 경우 DequeueReusableCell()을 적용하여 정상적으로 작동합니다 (스크롤 한 후에도 메모리 사용량이 늘어나지 않습니다). 그렇다면 테이블이 왜 왜곡 될 것입니까?

2) 내 애플 리케이션 회전을 지원합니다. scroll table 또는 scrollView를 사용하여 장치를 조금 기울이면 아마도 1 ~ 2 FPS가됩니다. 회전을 구현하는 가장 좋은 방법은 무엇입니까? 알다시피, ShouldAutorotateToInterfaceOrientation은 NavigationController 체인의 모든 컨트롤러에서 재정의되어야합니다. 또한 View에서 관찰자를 추가해야합니다. 변경 사항을 원합니다. 모든 뷰에서 BeginGeneratingDeviceOrientationNotifications()을 사용해야합니까, 아니면 Main.cs에서 충분합니까? 어쩌면이 속도가 느려지는 것일까 요?

3) 앱이 메모리 경고를 받기 시작하고 결국 충돌이 발생합니다. 나는 로그를 읽고 Instruments와 함께 응용 프로그램을 실행하려고 시도했지만 충돌의 원인을 찾을 수 없습니다.

4) NavigationController 스택에서 가져온 뷰에 정확히 무엇이 발생합니까? 나는 그것을 재사용 할 수 없다. 하지만 Monotouch (또는 나)가 올바르게 처리하지 못했을 수 있습니까?

절대 충돌이 발생하지 않는 회전 기능을 지원하지 않으면 iPhone과 거의 동일한 앱을 사용할 수 있습니다. 나는이 로테이션에 뭔가 잘못하고 있다고 생각하지만, 나는 무엇을 확신 할 수 없다.

도움이 될 것입니다. 미리 감사드립니다.

감사합니다.

답변

5

1 - 투명 필름은 항상 문제가됩니다. 코드에서 이미지를 렌더링하지 않더라도 전화기는 여전히 이미지 합성 작업을 수행해야하며 시간이 많이 걸릴 수 있습니다. UITableView는 새 셀이 표시되거나 테이블이 스크롤 될 때마다 최종 합성 이미지를 계산해야하며 이미지는 변경되지 않으므로 UIScrollViews는 한 번만 계산할 수 있습니다. 따라서 매우 조심스럽게 투명도를 해제하고 성능이 향상되는지 확인하십시오.

2 - 응용 프로그램의 모든 uiview에 알릴 필요는 없습니다. 예를 들어 UIViewController보기에서 항목을 다시 정렬하려는 경우와 같이 업데이트하려는 컨트롤러에서만 알림을받습니다.

3 - 하나 또는 여러 개의 메모리 누수가 있습니다. 내 생각 엔 MonoTouch는 UINavigationController와 같은 UIKit의 어딘가에서 여전히 링크되어 있기 때문에 UIViews 또는 UIViewController를 수집하지 못할 수 있습니다.

4 - UIKit에서 앱에 메모리 경고 알림이 도착할 때까지 UIView가 삭제되지 않습니다. .

+1

좋은 답변이지만 4) 올바르지 않습니다. UIView는 뷰가 더 이상 뷰 계층 구조의 일부가 아니고 (보기가 하위 뷰를 유지하므로), 다른 누구도 뷰를 유지하지 않는 즉시 해제됩니다. 그들은 메모리 경고에 전혀 신경 쓰지 않습니다. 반면 _controllers_보기는 현재 볼 수없는 경우 메모리 부족 상태에서 뷰를 언로드 할 수 있습니다. 이것은 네비게이션 컨트롤러에서 현재 표시된 컨트롤러의 "아래"에있는 뷰 컨트롤러에 적용되지만 스택에서 뷰 컨트롤러를 팝하면 즉시 해제되어야합니다. – omz

+0

Eduardo, omz, 도와 주셔서 대단히 감사합니다. 알파를 제거하고 개선 여부를 확인해 보겠습니다. omz, 보류를 해제 해 주셔서 감사합니다. 하지만 일부 하위보기를 공개하거나 매개 변수로 전달하면 어떻게됩니까? 수동으로 처리하면 아무 것도 가리 키지 않을까요? 또는 자동 폐기의 경우 해당 객체에는 여전히 다른 포인터가 있습니까? –

+0

@omz 바로 UIView가 출시됩니다. 질문 (비록 navviewcontroller에서 파생 된보기가 발생합니다)에서, 나는 그들이 UIViewController에 연결되었다는 것을 암시했습니다. –

2

에두아르도 (Eduardo)와 마찬가지로 Views의 알파 투명도는 가격이 책정됩니다.

https://developer.apple.com/videos/wwdc/2011/

    렌더링 계기
  • 이해 UIKit와
  • 아이폰 OS의 성능 및 전력 최적화

: 당신이에서 이러한 WWDC 2011 회담에서 논의 된 병목 현상을 식별하는 데 사용할 수있는 몇 가지 도구가 있습니다 iOS 시뮬레이터의 "디버그"메뉴에는 문제가있는 렌더링이 발생하는 곳을 나타내는 화면의 다른 영역을 색칠하는 다양한 디버깅 도구가 있습니다. WWDC 2011 협상에서 이러한 문제를 해결하기 위해 할 수있는 일이 나와 있습니다.

메모리 문제 때문에 주변에 물건을 지적한 것이므로 그 물체가 없어 졌는지 확인해야합니다. 현재 문제의 원인을 보여줄 수있는 MonoTouch 용 새 프로파일 러는 출시하지 않지만 어떤 객체가 살아 있는지를 좁히는 데 도움이되는 "빈약 한 사람의"디버그 유틸리티를 작성했습니다. 그것은 여기에 있습니다 :

http://tirania.org/tmp/HttpDebug.cs

전화 HttpDebug.Start()는 응용 프로그램에서 당신은 실행으로, 라이브 오브젝티브 C 오브젝트의 목록을 얻을 수 http://localhost:5000에 웹 브라우저와 연결 C 번호로 떠올랐다. 이 도구는 완벽하지 않으며 관련성이없는 많은 데이터를 보여 주지만 적어도 어떤 일이 벌어지고 있는지 알 수 있습니다.