2010-01-10 3 views
2

우리 앱에서의 스크롤링 성능을 향상시키고 자합니다. 나는 일반적으로 받아 들여지는 모든 조언을 따랐다. (CG로 그려라. 셀은 불투명하고 서브 뷰는 없다.) 배경 CPU와 네트워크 활동이있을 때 때로는 더듬 거리다.CGLayer를 사용하여 UITableView에서 셀을 캐시하기

하나의 해결책은 여기에 명시된 :

http://www.fieryrobot.com/blog/2008/10/08/more-glassy-scrolling-with-uitableview/

우리가 시도 세포의 비트 맵 스냅 샷을 캐시하는 것입니다. 그러나 비트 맵은 흐릿 해져서 1 톤의 메모리를 사용했습니다 (각각 ~ 수백 kb).

그래픽 카드의 메모리로 이동하기 때문에 CGLayer 또는 CALayer (?)를 사용하여 셀을 캐시하는 것이 좋습니다. 그럼 몇 가지 질문,

1) 어떤 시도 했습니까? 샘플 코드?

2) iphone/ipod touch 그래픽 카드의 메모리 용량은 얼마나됩니까? 이게 말이 되니?

3) 속도 향상에 대한 다른 제안 사항이 있습니까?


I는 (전화)에 CPU 샘플러를 사용

추가 정보 및 체계적 문제를 파악하는 셀로부터 물건을 제거. 몇 가지 :

1) 셀 설정이 아닙니다. 드로잉 호출 (drawinrect 등) 만 제거하고 설정은 그대로두면 유리처럼 보입니다.

2) 가장 작은 이미지 (25x25 png)의 그림이 아닙니다.

3) 두 번째 또는 세 번째 이미지를 추가하면 (첫 번째는 큰 배경 320x1004kB이고 다른 하나는 단추 이미지 61x35 4kB입니다) 그게 더듬 거립니다. 클래스 메서드에서 두 UIImages 잡아, 그래서 그것은 캐시됩니다.

4) 텍스트도 문제입니다. drawRect는 사용중인 NSString drawInRect 메서드에서 시간의 75 %를 소비합니다. 유사 :

[mytext drawInRect : drawright withFont : myFont lineBreakMode : UILineBreakModeTailTruncation];

이러한 호출은 webcore를 통과하는 것으로 보이며 그 중 일부는 더듬 거리는 원인이 될 수 있습니까? 두 줄의 텍스트와 하나의 작은 단락을 포맷 할 수 있어야합니다. 타원으로 텍스트를 잘라내는 기능이 필요합니다. 중요한 경로에서이를 수행하고 캐시 할 수 있습니까? 레이어로 그 부분을 할 수 있을까요?

답변

0

최적화를 너무 깊이하기 전에 UITableViewCell을 셀 재사용 메커니즘 ([tableView dequeueReusableCellWithIdentifier:])을 사용하여 대표자의 tableView:cellForRowAtIndexPath:에 만드시겠습니까?

또한 시뮬레이터에서 Instruments의 Activity Monitor를 사용하여 코드를 실행 했습니까? 간격을 1ms로 설정하십시오 (기본값 - 10ms - 너무 큼). 그리고 스크롤을 할 때 대부분의 시간을 보냅니다.

+0

이 질문을 해결하기 위해 원본 게시물에 몇 가지 추가 정보를 추가했습니다. 여전히 적당한 양의 메모리에 셀을 캐시하는 방법이 있어야합니까? –

+0

사실 링크 된 솔루션은 극단적 인 것이기 때문에 대부분의 iPhone 개발자는 기본 셀 재사용 메커니즘을 사용하여 드로잉을 장치 자체에 남겨 둡니다. 'tableView : cellForRowAtIndexPath :'를 게시 할 수 있다면, 도움이 될 것입니다. 드로잉 퍼포먼스에 가기 전에 실제로 시작해야합니다. –

+0

재사용 방법을 사용 중입니다. 모든 재사용 및 셀 설정을 수행 할 수 있으므로 문제가 나타나지 않지만 성능을 제대로 나타내지 않으면 문제가 발생하지 않습니다. 셀을 캐시하기까지 실제로 갔기 때문에 데이터를 설정할 필요가 없지만 병목 현상은 아닙니다. –

4

CGLayers는 GPU에 캐시되지 않으며, Core Graphics 요소를 컨텍스트에 그리는 과정에서 사용됩니다. CALayers는 GPU에 시각적 콘텐츠를 캐시합니다.이렇게하면 메모리 사용량을 "숨길"수 있지만 많은 CALayers를 보유하고 있으면 메모리 문제가 발생합니다.

로렌 브리 히터 (Loren Brichter) 등이 설명한대로 테이블보기 모범 사례를 따라 한 경우 코어 그래픽을 통해 모든 내용을 한 레이어에 그리며 셀을 불투명하게 만들고 다음과 같은 셀 재사용 메커니즘을 따르는 것이 좋습니다. 테이블보기, 당신이 할 수있는 일은 많지 않습니다. iPhone에서 CPU에 과부하가 걸리면 스크롤링이 원활하지 않게됩니다. 관성 스크롤 애니메이션을 실행하려면 약간의 CPU 전력이 필요합니다.

마지막으로 확인해야 할 것은 백그라운드 CPU 및 네트워크 프로세스가 실제로 백그라운드 스레드에서 실행되고 있다는 점입니다. 주 스레드에서 실행중인 모든 작업은 해당 작업이 처리되는 동안 상호 작용 방식을 일시 중지하여 잠재적으로 스크롤의 복잡성을 추가합니다.

+0

그래, 모든 네트워킹 작업 대기열을 통해 간다, 우리는 악기를 사용하여 주 스레드에서 네트워크 호출을 제거합니다. 가능한 한 빨리 항목을 다운로드하려고하기 때문에 매우 실망 스럽지만 사용자는 스크롤링에 대해 불만을 토로합니다 (물론 3G에서도 괜찮습니다!) –

+0

또 다른 질문으로 CALAYER와 캐시하고 싶다면 어떻게해야합니까? 그? 그리고 메모리 소비량은 비슷하거나 비트 맵 캐싱보다 낫지 않습니까? –

+1

CALayer에서 커스텀 UITableViewCell 서브 클래스를 위해 Quartz 드로잉을 모두 할 수 있습니다. 서브 클래스 화하고 드로잉 코드를 -renderInContext :에 배치하거나 위임자의 -drawLayer : inContext : 메소드에 코드를 배치하면됩니다. 그런 다음 CALayer를 필요에 따라 생성하고 NSMutableDictionary에 저장하고 표시 할 필요가있는 각 행에 대해 검색 할 수 있습니다 (사전 키는 행 번호 임). 그것을 표시하려면 행에 사용할 UITableViewCell의 하위 계층으로 레이어를 추가해야합니다. –