Compose SlotTable Mutation & FrameClock

Compose SlotTable Mutation Step-by-step + FrameClock Internals

1. SlotTable Mutation Step-by-step Diagram (애니메이션 개념 다이어그램)

아래는 SlotTable이 recomposition 동안 실제로 어떻게 변경되는지를 단계별 애니메이션처럼 구성한 다이어그램이다.
This diagram visualizes how SlotTable mutates step-by-step during recomposition.

[1] read CompositionLocal
     ↓
SlotTable lookup nearest provider

[2] State mutation happens
     ↓
Snapshot marks changed state

[3] Recomposer observes snapshot
     ↓
Marks dependent groups as `dirty`

[4] Recompose only dirty groups
     ↓
Group re-entered, new providers applied

[5] SlotTable writes updated nodes
     ↓
Commit phase

[6] UI refreshed

각 단계는 transactional하며, Snapshot → Recomposer → SlotTable → UI 순환을 가진다.


2. SlotTable 더 깊은 내부 구조 (Deep Internal Structure)

SlotTable의 핵심 구성요소:

SlotTable
 ├─ anchors[]        // Group 위치 고정
 ├─ slots[]          // 실제 값 저장
 ├─ groups[]         // composable boundaries
 │     ├─ parent pointer
 │     ├─ key index
 │     ├─ providerMask
 │     └─ slotIndex range
 └─ gapBuffer        // 삽입/삭제 최적화 구조

특징:

  • GapBuffer 기반으로 삽입/이동 비용이 낮다
  • Group/Slot이 연속 메모리 배열로 저장되어 매우 빠르다
  • CompositionLocal provider mask는 bit flag 기반 최적화

3. Recomposer FrameClock / MonotonicFrameClock

Recomposer는 FrameClock과 결합하여 UI 프레임 단위로 recomposition을 실행한다.
Recomposer coordinates with FrameClock to align recompositions with UI frames.

FrameClock 개념

requestFrame()
 ↓
FrameClock posts frame
 ↓
Recomposer runs applyChanges()
 ↓
UI redraw

MonotonicFrameClock

Compose가 제공하는 frame clock이며, Android choreographer와 연결된다.

Compose는 다음 루프를 기반으로 실행됨:

while (true) {
    await frame from MonotonicFrameClock
    apply pending changes
}

4. Recomposer Scheduler Internals

Recomposer는 세 가지 작업 큐를 가진다.

pendingRecompositions
applyChangesQueue
sideEffectsQueue

재구성은 다음 조건에서 실행됨:

  • Snapshot 변경 발생
  • FrameClock frame 도착
  • UI thread idle 시 yield

Compose의 scheduler는 coroutine 기반 cooperative scheduling을 사용한다.