-
CALayer 그리고 View와의 관계iOS 2021. 1. 31. 17:58728x90
개인적으로 공부하며 정리하는 블로그 입니다.
오류나 부족한 부분이 있을 수 있으니 감안하여 봐주시고 아낌없는 조언 감사드립니다 :DCA, Core Animation
CALayer의 CA는 Core Animation의 prefix입니다. CALayer를 알기 전에 먼저 Core Animation에 대해 알아보겠습니다.
Core Animation Programming Guide를 보면 Core Animation의 역할과 목적에 대해 나와있습니다.
Core Animation provides a general purpose system for animating views and other visual elements of your app. Core Animation is not a replacement for your app’s views. Instead, it is a technology that integrates with views to provide better performance and support for animating their content.
Core Animation은 뷰를 대신하지 못합니다. Core Animation의 목적은 뷰와 다른 시각적 요소들을 애니메이션하는 데 더 효율적인 방법을 제공하는 데 있습니다. 따라서 이번 포스팅은 Core Animation 이 어떻게 애니메이션을 더 좋은 성능으로 처리해줄 수 있는지에 대해 알아보는게 핵심이 될 것 같습니다
Layer-Based Drawing Model
Core Animation 프레임워크는 그 자체가 그리는 역할을 하지는 않습니다. 대신 그려진 콘텐츠를 관리하고 조작하는 기반 시설입니다. 코어 애니메이션의 핵심은 layer object인데요, layer의 주요 역할이 콘텐츠를 관리하고 조작하는 것입니다.
그럼 어떻게 애니메이션을 효율적으로 하는걸까요?
CALayer는 다음과 같은 과정을 거칩니다.-> layer는 뷰가 그려낸 콘텐츠를
-> Backing Store 라고 부르는 layer에 비트맵으로 캡쳐해서 캐시해둡니다.
-> 그리고 layer의 속성이 바뀌면 Core Animation은 그래픽 하드웨어(GPU)에게 layer에 캐시해둔 비트맵과 바뀐 상태정보를 전달합니다.
-> 그러면 GPU는 이 정보를 가지고 단순히 비트맵을 조작합니다.
아래 그림이 바로 위의 작업을 나타내고 있습니다 :)
layer-based drawing은 단순히 정적인 bitmap만을 조작하기 때문에 전통적인 view-based drawing 방식보다 효율적입니다.
view-based drawing은 view의 draw(rect:) 메소드를 가지고 뷰를 그리고 CPU를 사용해 main-thread 에서 작업하는데,
layer-based drawing은 캐시된 비트맵 정보를 가지고 hardware(GPU)에서 유사한 작업을 해줄 수 있기 때문이죠.CALayer 그리고 View와의 관계
layer는 배경색, border, shadow 등의 시각적 요소와 관련한 속성들을 가지고 있습니다. 또 view와 마찬가지로 위치, 크기와 계층관계를 가지고 있습니다. CALayer도 하위 layer들을 가질 수 있고 자신의 좌표계를 갖고 있습니다.
하지만 앞서 살펴봤듯이 layer가 view를 대신하지는 못합니다. layer 혼자서는 시각적 요소를 그릴 수는 없기 때문이죠. 그 밖에도 layer는 이벤트를 처리할 수 없고 responder chain에도 관여하지 못합니다. 이 외에도 여러 차이가 있는데 이렇기 때문에 앱은 사용자와 상호작용 하기 위해 반드시 하나 이상의 view를 필요로 합니다.
공식문서에 따르면 iOS에서는 모든 뷰가 기본적으로 하나 이상의 layer를 갖고 있지만 OS X에서는 선택사항이라고 합니다. 대부분의 뷰에 레이어를 두는게 효율적이겠지만요. 참고로 레이어가 앱의 메모리 오버헤드를 다소 증가시킬 수 있지만 이러한 단점보다 layer를 사용해서 얻는 이점이 더 크다고 하네요. 이렇게 layer를 갖는 view를 layer-backed view 라고 하는데. iOS는 모든 뷰가 하나 이상의 layer를 갖기 때문에 모두 layer-backed view가 됩니다.
주의할 점은 layer-backed view는 가능하면 layer를 조작하기 보다 view를 조작하는 걸 권장한다고 합니다. iOS에서는 view가 layer를 약간 감싼 형태이기 때문에 layer를 조작해도 대개 잘 작동한다고 하네요. 하지만 iOS든 OS X든 뷰 대신 레이어를 조작하는 건 예상치 못한 결과를 만들 수 있다고 합니다! 공식문서의 다른 부분에서 이러한 문제에 대한 부분을 다루고 있는 것 같습니다. 관심있으신 분들은 도큐먼트를 더 자세히 보시면 좋을 것 같아요 :) 저도 다음에 기회에 포스팅해봐야겠습니다.
Core Animation Programming Guide를 읽으면서 이해한 내용을 정리해봤습니다.
도움이 되셨다면 좋겠네요. 읽어주셔서 감사합니다 :)
참고
'iOS' 카테고리의 다른 글
RIBs) tutorial2 (1) 2021.06.26 RIBs) tutorial1 (0) 2021.06.25 Intrinsic Content Size, Content Hugging, Content Compression Resistance (0) 2021.01.24 GCD, Dispatch (0) 2021.01.19 [개발자 문서읽기] UIApplicationMain(::::) (0) 2021.01.16