XLOG

[UIKit] Layer 는 무엇일까? 왜 사용할까? 본문

Swift/UIKit

[UIKit] Layer 는 무엇일까? 왜 사용할까?

X_PROFIT 2023. 3. 1. 19:17

UIKit 에서 UIView 에 cornerRadius 를 주기 위해선 layer 에 속성값을 주고 clipToBound 를 해준다.

마치 View 를 Layer로 자르는 작업을 하는 듯...

그렇다면 이 Layer 는 무엇일까?

 

CALayer 타입이다. CA 는 CoreAnimation 을 뜻한다.

 

UIKit의 Core Animation 은 그래픽렌더링 및 애니메이션 인프라라고 한다. 그리고 Layer 는 우리의 View 가 Core Animation에서 작동하도록 만들어 주는 요소인 것 같다.

 

왜 UIKit은 Core Animation을 사용할까? 우리의 UI 는 단순히 view를 보여주기만 하는 것이 아닌 사용자와의 인터랙션도 일어난다.

다들 알고 있겠지만 main thread 는 UI를 담당하고 있다. 그렇기때문에 main thread 가 담당하는 부분을 분산시켜주기 위한 설계인 것 같다고 생각된다. 실제 Document 에서도 Core Animation을 써서 cpu 의 부하, 앱 속도가 느려짐 없이 높은 퍼포먼스를 보여준다고 한다.

 

This automatic graphics acceleration results in high frame rates and smooth animations without burdening the CPU and slowing down your app.

그렇다면 어떻게?

 

Layer 는 우리의 View를 Backing Store(caching) 작업을 하여 비트맵으로 변화를 시켜준다. 비트맵으로 변화를 줌으로 인해서 GPU 가 이를 처리하도록 한다. 

보통 애니메이션을 줄 때 속성의 변화 (시작값 과 종료값) 을 기반으로 동작한다.

UIKit 의 애니메이션에 대해 공부를 할 때 어디서 2초의 애니메이션을 줄때, 실제 뷰는 애니메이션 시작할때부터 종료값의 속성이 부여되어 있다는 것을 들었던 기억이 있다. 이때는 이게 도대체 무슨말인가 했었다. 근데 layer를 공부하면서 생각이 드는 것은, cpu에선 view의 속성을 바꿔서 draw 하되, layer를 통해 캐싱된 비트맵(뷰) 을 GPU에서 애니메이션을 적용하여 우리 screen에 보여주는 것 이라는 추측을 하게 되었다.

 

 

 

그래서 내가 생각한 우리가 보는 것은 아래 그림과 같이 동작하는것이 아닌가 조심스럽게 생각해본다.

참고

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004514-CH1-SW1