Jetpack Compose를 사용하여 개발을 시작하면 선언적 인터페이스의 매력에 쉽게 매료될 수 있습니다. 하지만 주의하지 않으면 애플리케이션이 느려지거나 짜증나는 끊김 현상을 겪게 될 수 있습니다. 모든 것을 원활하게 실행하는 핵심은 바로 이러한 점을 숙달하는 데 있습니다. 재구성이는 Compose가 데이터가 변경될 때 화면의 어느 부분을 업데이트해야 하는지 결정하는 프로세스입니다.
성능 최적화는 직관이나 맹목적으로 코드를 변경하는 문제가 아니라, 체계적인 접근 방식을 적용하는 것입니다. 과학적 접근 방식진정으로 매끄러운 사용자 경험을 구현하려면 모든 코드가 동일한 방식으로 실행되지 않는다는 점과 즉각적인 시각적 가치를 제공하지 않는 작업에 프로세서가 과부하되는 것을 방지하기 위한 특정한 방법이 있다는 점을 이해해야 합니다.
Compose의 렌더링 수명 주기
어둠 속에서 더듬거리는 것을 피하려면 먼저 Compose가 인터페이스를 어떻게 그리는지 이해해야 합니다. 모든 과정은 세 단계로 진행됩니다. 첫 번째 단계는... 구성상여기서는 표시할 요소를 정의하고 노드 트리를 생성합니다. 그 다음에는 다음 단계가 이어집니다. 디자인 단계 (레이아웃)이는 구성 요소를 측정하고 화면상의 정확한 위치를 알려주는 역할을 합니다. 마침내 우리는 다음 단계에 도달합니다. 렌더링 단계이는 픽셀이 물리적으로 그려지는 시점입니다.
문제는 구성 단계가 단연코 가장 비용이 많이 드는 단계라는 점입니다. 상태가 변경되어 전체 트리가 다시 생성되면 앱 속도가 느려집니다. 전문가들의 비결은 바로 이것입니다. 주를 격리하다 이렇게 하면 새로운 값이 반드시 필요한 구성 요소만 다시 빌드되어 업데이트의 연쇄 효과가 변경되지 않은 UI 부분에까지 미치는 것을 방지할 수 있습니다.
프로세서 부하를 줄이기 위한 전략
가장 흔한 함정 중 하나는 컴포저블 객체의 본문 내에서 직접 복잡한 계산을 수행하는 것입니다. 이러한 함수는 무수히 많이 실행될 수 있으므로(애니메이션의 모든 프레임에서 실행될 수도 있음!), 컴포저블 객체의 본문 내에서 복잡한 계산을 직접 수행하는 대신 다른 방법을 사용해야 합니다. 기억 결과를 캐시하기 위해서입니다. 정렬해야 하는 목록이 있다면 LazyColumn 내부에서 정렬하지 말고, 외부에서 정렬하고 메모리에 저장하여 원본 데이터가 실제로 변경될 때만 다시 계산되도록 하세요.
리스트 작업을 할 때는 할당하는 것이 매우 중요합니다. 안정적인 키 요소에 고유 키를 부여해야 합니다. 고유 키가 없으면 항목의 위치가 변경될 경우, Compose는 뒤따르는 모든 요소가 변경되었다고 판단하여 다시 구성할 수 있습니다. 고유 키를 사용하면 시스템은 요소가 단순히 이동한 것임을 이해합니다. 실행 시간 절약 상당히 최적화하여 LazyColumn을 사용하여 효율적인 목록 만들기.
derivedStateOf와 지연 읽기의 힘
때때로 상태가 너무 빠르게 변해서 불필요한 재구성이 발생할 수 있습니다. 대표적인 예로 목록 스크롤이 있습니다. 사용자가 아래로 스크롤했을 때만 "맨 위로" 버튼을 표시하고 싶다면, 모든 픽셀의 움직임을 알 필요는 없고, 보이는 첫 번째 항목의 인덱스가 0보다 큰 경우에만 필요합니다. 바로 이 부분에서 문제가 발생합니다. 파생된 상태 이 기능은 조건 결과가 변경될 때만 Compose에 알림을 보내는 필터 역할을 하여 업데이트 빈도를 획기적으로 줄여줍니다.
또 다른 고급 기술은 주별 읽기 시험을 연기하세요값을 직접 전달하는 대신 람다 시그널을 전달할 수 있습니다. 이렇게 하면 값 읽기가 합성 단계에서 발생하지 않고 연기됩니다. 만약 우리가 사용한다면 람다 기반 수정자 ( offset { ... } 대신 offset(dp)) 구성 및 디자인 단계를 건너뛰고 바로 도면 작업에 들어갈 수 있으므로 배터리 성능과 원활한 작동에 큰 도움이 됩니다.
데이터 안정성 및 기본 모드
Compose는 매우 지능적이어서 입력 매개변수가 안정적이라고 판단되면 재구성 단계를 건너뛸 수 있습니다. 한 가지 유형은 다음과 같습니다. 안정된 값이 변경 불가능하거나 컴파일러가 값이 변경되지 않았음을 보장할 수 있는 경우 UI를 업데이트할 필요가 없습니다. 외부 라이브러리의 클래스나 Compose에서 불안정하다고 판단하는 형식을 사용하는 경우, 데이터가 동일하더라도 함수는 항상 재구성됩니다.
이 문제를 해결하기 위해 어노테이션을 사용할 수 있습니다. @불변 o @안정적인 데이터 클래스에서 그렇습니다. 만약 코드가 Compose 컴파일러가 사용하지 않는 외부 모듈에 있다면, 다른 방법을 사용할 수 있습니다. 안정성 구성 파일 해당 패키지를 수동으로 안정 버전으로 표시합니다. 또한 다음을 활성화합니다. 강력 건너뛰기 모드 Gradle 설정에서 Compose는 인스턴스 동등성을 사용하여 불안정한 매개변수를 가진 함수도 건너뛸 수 있으므로 코드를 거의 건드리지 않고 앱을 최적화할 수 있습니다.
실제 도구를 이용한 진단 및 측정
측정할 수 없는 것은 최적화할 수 없습니다. 레이아웃 검사기 Android Studio에서 "핫스팟"을 감지하는 기본 도구는 [도구 이름]입니다. 간단한 작업을 수행하는 동안 핫스팟 발생 횟수가 지속적으로 증가하는 경우 문제가 있는 것입니다. 더 자세한 분석을 위해서는 [도구 이름]을 사용하세요. 매크로벤치마크 Perfetto의 로그를 사용하면 각 함수가 메인 스레드에서 정확히 얼마나 많은 시간을 소비하는지 확인할 수 있습니다.
예방하는 것이 필수적입니다. 메인 스레드 무거운 작업을 할 때 멈춰버립니다. 대용량 이미지를 로드할 때 특히 그렇습니다. painterResource 시스템 수신기를 등록하는 과정에서 미세한 장애가 발생할 수 있습니다. 해결책은 이러한 작업을 다른 곳으로 옮기는 것입니다. Dispatchers.IO를 사용한 코루틴 그리고 가능하다면, 다음과 같은 방법으로 국가의 위상을 높이십시오. 구성 로컬 이렇게 하면 정보를 각 매개변수를 통해 수동으로 전달할 필요 없이 트리 전체에서 정보를 사용할 수 있으므로 인터페이스 아키텍처가 깔끔해집니다.
유연한 애플리케이션을 구현하려면 메모리 기능의 활용, 클래스 안정성의 적절한 관리, 람다를 사용하여 읽기 상태를 연기함으로써 설계 및 드로잉 단계를 활용하는 능력 사이의 균형을 유지해야 하며, 각 변경 사항이 시스템 부하를 실제로 줄이는지 확인하기 위해 측정 도구를 항상 활용해야 합니다. 이 가이드를 공유하여 다른 사용자들이 이 주제에 대한 정보를 얻을 수 있도록 도와주세요.

