2010-04-27 2 views
0

멋진 애니메이션을 만들기 위해 -drawRect :를 광범위하게 사용합니다. 타이머는 -setNeedsDisplay를 사용하여 초당 30 번 실행하려고 시도하지만 20 번 정도 느껴집니다. 또한 -setNeedsDisplayInRect를 사용할 수 없습니다. 애니메이션이 모든 것을 다루기 때문입니다.빠른 무엇입니까? 그림 또는 합성?

일부 드로잉 작업을 -drawRect :에서 꺼내 서브 뷰로 옮기는 것이 도움이 될까요? -drawRect는 적은 작업을 수행해야하지만 대신 OS는 합성보기에 대해 더 많은 작업을 수행합니다.

더 악화되는 엄지 손가락 규칙이 있습니까? 사과 텍스트에서 코어 애니메이션이 애니메이션 중에 다시 그리지 않는다고 주장한 것을 기억합니다. 그래서 속도의 비밀은 무엇입니까? 애니메이션에서 서브 뷰 사용하기? 이것의

답변

1

대부분은 my answeryour other question에 유사합니다

합성은 지금까지, 빠릅니다. iPhone의 경우 콘텐츠는 Quartz 그리기 호출을 사용하거나 비트 맵 이미지를 사용하여 CALayer (또는 UIView의 백업 CALayer)로 그려집니다. 이 레이어는 래스터 화되고 GPU에서 OpenGL 텍스처로 효과적으로 캐싱됩니다.

이 드로잉 및 캐싱 작업은 비용이 많이 들지만 일단 GPU에 레이어가 있으면 하드웨어 가속 방식으로 이동, 크기 조절, 회전 등의 작업을 수행 할 수 있습니다. 레이어가 움직이는 동안 모든 GPU는 모든 프레임의 다른 화면 레이어와 합성해야합니다. 이것이 Core Animation이 가장 오래된 iPhone 모델에서도 60FPS로 화면 주위에서 50 개의 레이어 애니메이션을 할 수있는 이유입니다.

레이어 및보기는 메시지가 표시 될 때 또는 needsDisplayOnBoundsChange 속성이 YES로 설정된 경우 크기가 조정 된 경우에만 다시 그립니다. 도면 시스템은 레이어 내용을 다시 그리거나 다시 캐시하는 것이 얼마나 비싸므로 이러한 방식으로 설정됩니다. 가능한 경우 레이어 컨텐트를 정기적으로 다시 그리지 말고 대신 Core Animation을 사용하여 개별적으로 애니메이션을 적용 할 수있는 레이어 나 뷰로 분할하십시오. 변화하는 도형에 애니메이션을 적용해야하는 경우 CAShapeLayer를 사용하면 모든 프레임을 다시 그리는 것보다 훨씬 효율적입니다.

최악의 경우 네, 정적 인보기의 부분을 가져 와서 한보기로 이동 한 다음 그 안에 변경된 부분 만 가진 하위보기를 가질 수 있습니다. 성능은 좋지 않지만보기에서 모든 것을 다시 그려야하는 것보다 훨씬 낫습니다. 합성 오버 헤드는 드로잉 비용에 비해 무시할 수 있습니다.