2009-09-01 7 views
0

많은 CALayers (~ 1000)가있는 UIView가 있는데, 각 UI에는 내용이 작은 이미지가 있습니다. 이 UIView는 scrollview의 하위 뷰입니다 (실제로는 scrollview의 하위 뷰인 다른 뷰의 하위 뷰입니다). 이것은 비교적 빨리 처음에 그립니다 (2 초). 그러나 scrollview에서 스크롤 할 때 프레임 속도가 매우 낮습니다.이동했을 때 CALayer 내용을 다시 그릴 수 없음 (iphone)

스크롤 할 때마다 각 CALayer의 내용을 다시 그려 보려고합니까? 이것을 사용 중지하는 방법이 있습니까? 다른 일이 진행되고 있습니까?

참고 : 나는 NOO N 내 UIView의에 clearsContextBeforeDrawing를 설정하고이 다소 도움이하지만

+0

왜 많은 레이어가 필요합니까? 레이어가 스크롤되거나 보이지 않을 때 레이어를 제거/추가 할 수 있습니까? (1000 개의 레이어가 많이 있습니다) – rpetrich

답변

2

층 다시 그려서는 안되지만 GPU를 사용하여 합성됩니다. 인스트루먼트에서 Sampler 및 OpenGL ES 장비를 사용하여 병목 현상이 CPU 또는 GPU에 있는지 확인하십시오. 측량기 이름 옆에있는 "i"를 탭하고 추가 매개 변수 (Tiler Utilization, Renderer Utilization 등)를 선택하여 OpenGL ES 계측기 내에서 추가 세부 정보를 기록 할 수 있습니다. OpenGL 값 중 하나가 100 %에 가까워지면 그 결과가 다시 합성됩니다. 그러나 샘플러가 -drawRect : 또는 유사한 메소드에 대한 호출을 여러 번 표시하면 어떤 이유로 인해 도면층이 다시 그려지기 때문에 문제가 될 수 있습니다.

또한 Core Animation 악기를 사용하여 불투명하지 않은 레이어의 색을 지정하면 디스플레이 프레임 속도가 저하 될 수 있습니다.

+0

Brad. 퇴비화 단계가 병목인지 알아낼 수 있는지 알아 보겠습니다. 나는 그것이 그것이다고 생각하고있다. 당신은 그 단계를 빠르게하는 방법에 대한 생각을 가지고 있습니까? 스크롤 할 때 다시 합성 할 필요가 없습니다. 합성을 비활성화 한 다음 필요한 경우 (즉, 레이어 내용 중 하나가 실제로 변경 될 때만) 수동으로 다시 합성하는 방법이 있습니까? –

+0

합성 속도를 높이려면 가능한 한 불투명 한 레이어를 사용하십시오. 또한 스크롤 과정에서 하위 레이어가 화면에 표시 될 때 하위 레이어를 추가 및 제거 할 수도 있습니다. 레이어의 이미지가 변형으로 확대되는 이미지가 더 큽니까? 그렇다면 이미지 크기를 미리 지정하고 필요한 크기만큼만 미리 조정할 수 있습니다. 변환은 약간의 성능 저하를 초래할 수도 있습니다. –

+0

이들은 모두 아주 좋은 팁입니다 :) – rpetrich

0

을 기대하는 것보다 당신의 층에 needsDisplayOnBoundsChange 재산 NO로 설정 여전히 훨씬 느린 :

[layer setNeedsDisplayOnBoundsChange:NO]; 
+0

고마워요.하지만 이럴 수는 없습니다. scrollview 스크롤 될 때 scrollview subview 변경됩니다 확실하지 않습니다. –

관련 문제