Flutter
Flutter 리스트가 느릴 때 에뮬레이터와 실기기에서 다르게 보이는 이유
Flutter에서 리스트 성능이 느릴 때 에뮬레이터와 실제 안드로이드/iOS 기기에서 확인해야 할 사항들을 정리했다.
Flutter 개발 중 리스트 렌더링이 느린 문제를 만나면, 에뮬레이터에서는 멀쩡한데 실기기에서만 끔직할 때가 있다. 이런 상황은 두 환경의 리소스가 완전히 다르기 때문이다.
실기기의 성능 제약을 먼저 이해하기
에뮬레이터는 개발 머신의 모든 리소스를 쓸 수 있지만, 실제 휴대폰은 RAM, CPU, 배터리 모두 제한적이다. 특히 구형 안드로이드 기기나 저사양 폰에서는 Dart의 가비지 컬렉션이 더 자주 발생하고, 각 프레임을 60fps나 120fps로 렌더링하는 게 힘들 수 있다.
flutter doctor -v
flutter run --verbose
리스트 빌더의 성능 문제 확인하기
먼저 어느 부분이 느린지 파악해야 한다. ListView.builder를 쓰고 있는지, 아니면 전체 리스트를 메모리에 로드하는 ListView를 쓰고 있는지 확인하자. itemCount를 정확하게 설정했는지, 각 아이템의 build 메서드가 얼마나 복잡한지 살펴보자.
위젯 rebuild 횟수 줄이기
Flutter DevTools의 Performance 탭에서 프레임이 얼마나 떨어지는지 확인할 수 있다. 같은 위젯이 불필요하게 여러 번 rebuild되고 있다면, const 생성자를 사용하거나 const 위젯으로 감싸서 rebuild를 피하자.
이미지와 네트워크 호출 최적화
리스트의 각 아이템에서 이미지를 로드하고 있다면, Image.network의 cacheHeight와 cacheWidth를 설정해서 메모리 사용을 줄이자. 네트워크 호출이 필요하다면 리스트 스크롤 중에 무분별하게 API를 호출하지 않도록 throttling이나 lazy loading을 구현하자.
로그로 성능 측정하기
flutter run --profile 모드에서 앱을 실행하면 좀 더 현실에 가까운 성능을 볼 수 있다. 혹은 Stopwatch 클래스를 써서 아이템 빌드에 걸리는 시간을 측정해보자. 느린 부분을 정량화해야 어디를 최적화할지 알 수 있다.
상태 관리 구조 재검토
불필요한 상태 업데이트로 전체 리스트가 rebuild되고 있지는 않은지 확인하자. Provider나 Riverpod, GetX 등의 상태 관리 라이브러리를 쓰고 있다면, 정말 필요한 부분만 리스너를 붙였는지 다시 확인해보면 좋다.