비트맵 이미지 최적화

이미지 작업을 할 때는 주의하지 않으면 금방 성능 문제가 발생할 수 있습니다. JPG나 PNG와 같은 압축 형식의 작은 그래픽도 표시를 위해 디코딩되면 큰 비트맵으로 바뀔 수 있습니다.그래픽 사용이 효율적이지 않으면 메모리 문제가 발생하여 앱과 기기의 다른 앱 성능이 저하될 수 있습니다. 앱이 최상의 성능을 발휘하게 만들려면 다음 권장사항을 따르세요.

이미지 로드 라이브러리 사용

Coil (Kotlin 우선 프로젝트용) 또는 Glide (Java 프로젝트용)와 같은 이미지 로드 라이브러리를 사용하여 앱의 효율성을 개선할 수 있습니다. 이러한 라이브러리는 이미지를 캐시하고, 필요할 때 그래픽 크기를 조절하고, 그래픽 객체를 재활용하는 등의 작업을 통해 앱의 메모리 사용량을 줄입니다.

적절한 경우 이미지 크기 조절

필요에 맞는 적절한 이미지 크기를 사용해야 합니다. 예를 들어 작은 썸네일에 큰 이미지를 로드해서는 안 됩니다. 대신 inSampleSize과 같은 메서드를 사용하여 리샘플링된 이미지 버전을 로드하세요.

Coil 및 Glide와 같은 이미지 로드 라이브러리는 기본적으로 이 리샘플링을 자동으로 처리합니다. ImageLoader (Coil의 경우) 또는 DownsampleStrategy (Glide의 경우)를 사용하여 다운샘플링 전략을 구성할 수 있습니다.

다양한 화면 크기에 맞는 대체 리소스 제공

앱과 함께 이미지를 제공하는 경우 기기 해상도에 따라 다양한 크기의 애셋을 제공하는 것이 좋습니다. 이렇게 하면 기기에서 앱의 다운로드 크기가 줄어들고 해상도가 낮은 기기에 더 낮은 해상도의 이미지가 로드되므로 성능이 개선됩니다. 다양한 기기 크기에 맞는 대체 비트맵을 제공하는 방법에 관한 자세한 내용은 대체 비트맵 문서를 확인하세요.

패딩을 직접 적용하지 않음

이미지에 패딩을 추가해야 하는 경우가 있습니다. 예를 들어 레터박싱을 위해 이미지를 투명 테두리로 둘러싸고 싶을 수 있습니다. 이러한 경우 이미지의 크기를 변경하여 이미지에 직접 패딩을 추가하지 마세요. 대신 이미지의 크기를 그대로 두고 InsetDrawable를 사용하여 화면에서 이미지의 위치를 조정합니다. 또는 이미지를 보유한 컴포저블이나 뷰에 패딩을 추가할 수 있습니다.

올바른 픽셀 형식 선택

올바른 픽셀 형식을 선택하여 메모리와 품질의 균형을 맞춥니다. 투명도가 필요하지 않은 경우 RGB_565를 사용하세요. 이 형식은 기본 ARGB_8888 형식의 절반 메모리를 사용합니다.

Glide에서는 DecodeFormat를 사용하여 이를 구성할 수 있습니다. Coil에서는 bitmapConfig 속성을 사용할 수 있습니다.

가능한 경우 벡터 사용

기하학적 모양으로 구성된 이미지의 경우 벡터 그래픽은 비트맵보다 훨씬 작으며 모든 디스플레이 밀도에 맞게 원활하게 조정됩니다. 적절한 경우 ShapeDrawable과 같은 요소를 사용하여 그래픽을 나타냅니다.

가능한 경우 비트맵 해제 및 재사용

큰 그래픽 파일은 많은 메모리를 차지할 수 있습니다. 영향을 줄이려면 가능한 한 그래픽 객체를 해제하거나 재사용해야 합니다.

이미지 로드 라이브러리를 사용하는 경우 더 이상 필요하지 않은 비트맵을 라이브러리의 관리 풀에 해제해야 합니다. 라이브러리는 필요할 때 객체를 재사용할 수 있으며 향후 필요에 대비해 메모리 버퍼를 사용할 수 있도록 유지합니다.

그래픽을 수동으로 관리하는 경우 가비지 컬렉션을 사용하는 대신 Bitmap.recycle를 호출하여 비트맵을 완료할 때 비트맵을 해제하고 Bitmap 참조를 즉시 삭제해야 합니다.

기타 도움말 및 유용한 정보

이 섹션에서는 그래픽을 처리할 때 앱의 성능을 개선할 수 있는 몇 가지 다른 방법을 설명합니다.

대용량 이미지를 AAB/APK 파일로 패키징하지 않기

앱 다운로드 크기가 커지는 주요 원인 중 하나는 AAB 또는 APK 파일 내에 패키징된 그래픽 때문입니다. APK Analyzer 도구를 사용하여 필요한 이미지 파일보다 크게 패키징하지 않도록 합니다. 크기를 줄이거나 이미지를 서버에 두고 필요할 때만 다운로드하는 것이 좋습니다.

중복 비트맵 찾기

동일한 이미지가 여러 개 있으면 메모리가 낭비됩니다. Android 스튜디오 프로파일러를 사용하여 중복 그래픽을 식별할 수 있습니다. 힙 덤프 분석기를 사용하여 힙 덤프를 캡처하고 중복 비트맵 설정을 선택하여 결과를 필터링합니다.

ImageBitmap을 사용할 때 그리기 전에 prepareToDraw 호출

ImageBitmap을 사용할 때 GPU에 텍스처를 업로드하는 프로세스를 시작하려면 실제로 그리기 전에 ImageBitmap#prepareToDraw()를 호출합니다. 그러면 GPU가 텍스처를 준비하고 화면에 시각 요소를 표시하는 성능을 향상할 수 있습니다. 대부분의 이미지 로드 라이브러리는 이러한 최적화를 이미 실행하지만 ImageBitmap 클래스를 직접 사용한다면 이 사항에 유의해야 합니다.

컴포저블에 Painter 대신 Int DrawableRes 또는 URL을 매개변수로 전달

이미지 처리의 복잡성으로 인해 (예: Bitmaps의 equals 함수를 작성하는 데 드는 높은 계산 비용) Painter API는 @Stable 주석을 사용하여 안정적인 클래스로 명시하지 않습니다. 불안정한 클래스의 경우 데이터가 변경되었는지 컴파일러가 쉽게 추론할 수 없으므로 불필요한 리컴포지션으로 이어질 수 있습니다.

따라서 Painter를 매개변수로 전달하는 대신 URL 또는 드로어블 리소스 ID를 매개변수로서 컴포저블에 전달하는 것이 좋습니다.

// Prefer this:
@Composable
fun MyImage(url: String) {

}
// Over this:
@Composable
fun MyImage(painter: Painter) {

}