현재 상태 스냅샷 접근
Composer는 현재 스냅샷에 대한 참조값을 가지고 있는데, 이 유형은 현재 스레드에 대한 가변적인 상태 혹은 상태 객체들이 반환하는 값의 스냅샷과 유사하다.
모든 상태 객체는 스냅샷에서 명시적으로 변경되지 않는 한 스냅샷이 생성되었을 때와 동일한 값을 스냅샷에서 갖는다
노드 탐색
노드 트리 탐색은 Applier에 의해 수행되지만, Applier가 이를 직접 수행을 하진 않는다.
Applier가 구독자에 의해 탐색되는 노드의 위치들을 기록하고 downNodes 라는 배열에 기록함으로써 수행된다.
노드 탐색이 실행되면 downNodes에 있는 모든 하향 노드 정보를 Applier에 전달하게 되고, 만약 하향 노드 탐색이 수행되기 전에 상향 노드 탐색이 수행될 경우에는 downNodes 스택에서 제거함으로써 탐색 경로를 단축시킨다.
구독자와 작성자의 동기화 유지
특정 그룹을 삽입/삭제/이동 할 때 작성자의 그룹 위치는 변경 사항이 적용될 때까지 일시적으로 구독자와 위치가 다를 수 있다.
이 차이를 추적하기 위해 델타(delta)를 유지 관리해야 하는데, 이 델타는 삽입, 삭제, 이동의 행동에 따라 업데이트되며, Compose의 소스코드 문서에 명시되어 있는 내용에 따르면 ,
“작성자와 구독자의 현재 슬롯 위치를 정확하게 일치시키기 위해 이동해야 하는 실현되지 않은 거리”
를 반영한다고 한다.
구독자와 작성자간의 동기화 유지를 수행하는 작업들은 Compose runtime 라이브러리의 ComposerChangeListWriter에서 수행된다.
해당 클래스 내에서는 writerReaderDelta라는 변수가 존재하고, 구독자와 작성자 간의 슬롯 위치를 지속적으로 계산하는 아래와 같은 함수들이 있다.
private var writersReaderDelta: Int = 0
fun moveReaderRelativeTo(location: Int) {
writersReaderDelta += location ‑ reader.currentGroup
}
fun moveReaderToAbsolute(location: Int) {
writersReaderDelta = location
}
위 함수들은 앞서 말한 구독자 - 작성자 간의 격차를 추적하기 위해 Composer에 의해 지속적으로 호출된다.
그리고 그룹이 생성되거나, 값이 업데이트 될 때마다 아래와 같은 realizeOperationLocation 함수를 실행시켜 구독자 - 작성자의 거리 간격을 정확하게 일치시킨다.
private fun realizeOperationLocation(forParent: Boolean = false) {
val location = if (forParent) reader.parent else reader.currentGroup
val distance = location ‑ writersReaderDelta
runtimeCheck(distance >= 0) {
”Tried to seek backward”
}
if (distance > 0) {
changeList.pushAdvanceSlotsBy(distance)
writersReaderDelta = location
}
}
'Android' 카테고리의 다른 글
[Android] Compose 런타임 - (8) (0) | 2024.12.04 |
---|---|
[Android] Compose 런타임 - (7) (0) | 2024.12.03 |
[Android] Compose 런타임 - (5) (0) | 2024.11.29 |
[Android] Compose 런타임 - (4) (0) | 2024.11.28 |
[Android] Compose 런타임 - (3) (0) | 2024.11.27 |