Geon

Demystify SwiftUI performance 본문

SwiftUI/지식 창고

Demystify SwiftUI performance

jgkim1008 2024. 11. 10. 21:06

SwiftUI 렌더링 과정

  • 꼭 필요한경우에만 업데이트 해야한다.
  • 종속성을 줄여야한다.
  • Self.printChanges() 를 통해 View가 무엇때문에 변경되는지 확인가능
SwiftUI 렌더 과정 View Value

Dynamic property update Updated View Value 종속성 줄여야하는 이유 (1) 종속성 줄여야하는 이유 (2)
  view에 새로운 값 생성
- 저장된 모든 프로퍼티에 값을 할당(dogs, 동적 프로퍼티등)
SwiftUI는 View의 동적 프로퍼티를 모두 업데이트 해 동적 프로퍼티의 값을 그래프에 있는 값으로 바꿈 업데이트 한값을 이용해 body가 실행되며 View의 자식을 생성한다. 이 과정을 반복하며 View가 업데이트 된다. 모든 View가 업데이트 되는것이 아닌 값이 새로 바뀌거나 종속성이 바뀐 뷰만 업데이트 데이터가 변형되면 복사본이 새로 만들어지며, 스택에 새 컨텐츠가 만들어지고,그에 따라 스택의 자식도 업데이트 된다.
struct DogView: View {
  @Environment(\.isPlayTime) private var isPlayTime
  var dog: Dog
  var body: some View {
  	Text(dog.name)
  		.font(nameFont)
  	Text(dog.breed)
  		.font(breedFont)
  		.foregroundStyle(.secondary)
  		
  	// ScalableDogImage(dog) // 종속성을 넘기지 말고 사용할 단일변수 만 넘김
  	  	ScalableDogImage(dog.image) // 이러면 dog.image만 변경될때 다시 그림

  	DogDetailView(dog)
  	
  	LetsPlayButton()
  		.disabled(dog.isTired)
  }
 }
}

 

SwiftUI에서 행과 히치는 둘다 업데이트가 느려서 생기는 문제

  • 동적프러퍼티 인스턴스화가 너무 비싼경우
  • View Body가 비싼경우(데이터 필터링, 비싼 문자열 보간, 기타 작업연산)
  • Slow Identification

ForEach 아래처럼 쓰지 않기

  • ForEach는 명시적 아이덴티티를 가진다.
  • View 갯수를 일정하게 유지하기
  • if 문,AnyView, dogs에 filter 대신 filter가 적용된 Model 사용하기 (List는 자기 내부의 ID를 알아야 효율적으로 그릴수 있다.)
  • 중첩된 forEach 쓰지 않기(Section을 사용할경우 제외 SwiftUI가 이 구성을 이해하여 더빠른 렌더를 할수 있다.)

 

 

 

출저: https://developer.apple.com/kr/videos/play/wwdc2023/10160/

 

 

 

 

'SwiftUI > 지식 창고' 카테고리의 다른 글

Write Swift macros(1)  (0) 2024.11.12
Discover Observation in SwiftUI  (0) 2024.11.11
Explore UI animation hitches and the render loop  (0) 2024.11.09
Image DownSampling  (1) 2024.11.08
Demystify SwiftUI  (0) 2024.11.07