작성 시기 최적화
앞선 포스팅에서 봤듯이 새로운 노드를 삽입하는 작업은 Composer가 담당한다.
Composer는 변경 사항이 방출될 때, 해당 데이터들을 기록하는 대신 곧바로 슬롯 데이블에 변경 사항을 작성할 수 있다.
그 외의 경우에는 해당 변경 사항들이 변경 목록에 기록되고 잠시 지연되는데, 이는 아직 해당 변경 사항들을 적용할 시점이 아니기 때문이다.
쓰기 및 읽기 그룹
composition이 완료되면 composition.applyChanges()가 호출되며 트리를 구체화하고 변경 사항이 슬롯 테이블에 저장된다.
Composer는 데이터, 노드, 그룹 등 다양한 유형의 정보를 작성할 수 있는데, 그 중 “그룹”은 단순화를 위해 모든 항목을 종합하여 저장하는 형태이다.
Composer는 모든 그룹을 시작 및 종료할 수 있으며 이 동작에 따라 다른 의미를 갖는다.
쓰기 경우에는 슬롯 테이블에서 “그룹 생성” 및 “그룹 제거”를 의미한다.
읽기 경우에는 SlotReader는 읽기 작업을 시작하거나 종료하기 위해 읽기 포인터를 그룹 외부로 이동시킨다.
Composable 트리의 노드는 삽입, 삭제, 이동 될 수 있는데 “그룹 제거”가 실행되면 그에 해당하는 모든 슬롯을 테이블에서 제거하는 것을 의미한다.
이를 위해 Composer는 SlotReader를 적절하게 배치하고 해당 그룹은 삭제되었으므로 건너뛰며, 해당 그룹의 모든 노드를 Applier에서 제거하는 작업을 수행한다.
모든 수정 작업은 위에서 말한대로 일괄적으로 적용되기 위해 예약되어야 한다.
이는 모든 변경 사항이 동시에 같이 반영되어야 의미가 있으며 Composer는 더 이상 아무 데이터도 방출하지 않을 제거된 그룹에 대해 예약된 업데이트(invalidation) 작업을 폐기한다.
그룹은 새 노드를 만들 필요가 없고, 이미 존재할 경우 재사용된다.
이는 Applier에 의해 노드로 이동하는 작업을 발행 하지만, 새롭게 생성하고 초기화하는 작업은 생략된다.
노드의 속성에 업데이트가 필요한 경우, 그 업데이트에 대한 동작 또한 Change로 기록된다.
값 기억하기
마지막 composition으로부터 정상적으로 값이 변경되었는지 확인하는 작업은 remember 함수가 호출되는 즉시 수행되지만, 업데이트 작업은 Composer가 값을 이미 적용하는 중이 아니라면 change로 기록된다.
업데이트할 값이 RememberObserver인 경우 Composer는 composition의 기억 작업을 추적하기 위해 암시적 Change도 함께 기록한다.
이는 나중에 기록하고 있는 모든 값을 초기화 할 때 사용하기 위함이다.
'Android' 카테고리의 다른 글
[Android] Compose 런타임 - (6) (0) | 2024.12.02 |
---|---|
[Android] Compose 런타임 - (5) (0) | 2024.11.29 |
[Android] Compose 런타임 - (3) (0) | 2024.11.27 |
[Android] Compose 런타임 - (2) (0) | 2024.11.26 |
[Android] Compose 런타임 - (1) (0) | 2024.11.25 |