시계 화면의 메모리 사용량 최적화

Wear OS 기기의 배터리 수명을 최대한 보장하기 위해 시스템은 메모리 사용량 계산을 실행합니다. Wear OS 앱 품질 가이드라인에 따라 워치 페이스 형식을 사용하는 시계 화면은 시계의 현재 상태에 따라 사용할 수 있는 메모리 양에 제한이 있습니다.

  • 대기 모드에서 시계 화면은 메모리를 10MB 이상 사용할 수 없습니다.
  • 대화형 모드에서 시계 화면은 메모리를 100MB 이상 사용할 수 없습니다.

시스템이 시계 화면의 메모리 사용량 계산

워치 페이스 형식을 사용하는 시계 화면 내의 이미지 또는 비트맵 글꼴이 차지하는 크기를 계산하려면 시스템은 다음 단계를 완료합니다.

  1. 이미지 또는 비트맵 글꼴의 압축을 풉니다.
  2. 이미지 또는 비트맵 글꼴을 검사하여 다음 방법 중 하나로 최적화할 수 있는지 확인합니다.
    • 디스플레이 크기에 맞게 크기가 조절되었습니다.
    • 완전히 투명한 픽셀을 제거하기 위해 잘라냈습니다.
    • 충실도 손실 없이 실행할 수 있는 경우 RGB565로 다운샘플링되었습니다.

결과 경계 상자를 기반으로 시스템은 이미지 또는 비트맵 글꼴의 크기를 다음 중 하나로 바이트 단위로 계산합니다.

  • RGBA8888을 사용하는 이미지 및 글꼴: \( 4 \times width \times height \)
  • RGB565를 사용하는 이미지 및 글꼴의 경우: \( 2 \times width \times height \)
  • ALPHA_8 비트맵 구성을 사용하는 이미지 및 글꼴:\( width \times height \)

대화형 모드

대화형 모드의 메모리 사용량을 계산할 때 시스템은 다음 항목의 합계를 계산합니다.

  1. 벡터 글꼴의 처리되지 않은 크기입니다.
  2. 시스템 기본 글꼴의 예상 사용량입니다.
  3. 자르기, 크기 조절 또는 형식 다시 지정이 적용된 후의 이미지 및 비트맵 글꼴의 총 크기

구성

구성이 포함된 시계 화면의 경우 시스템은 여러 구성에서 사용된 리소스의 총 크기를 계산하려고 시도합니다. 조합의 수가 매우 많을 때 시스템은 여러 구성에서 동시에 사용되는 리소스 수를 약간 과대평가하는 경우가 있습니다.

대기 모드 및 레이어

대기 모드의 경우 시스템은 시계가 최대 3개의 전체 화면 레이어를 사용하여 렌더링된다고 가정합니다. 이 중 두 개는 완전히 정적입니다.

  1. 시계 요소 아래의 모든 항목 시계 화면의 '본문' 대부분은 이 레이어로 합성됩니다. 이 레이어를 그리는 데 얼마나 많은 이미지가 사용되었는지는 중요하지 않습니다. 시스템은 레이어를 전체 화면 이미지 1개로 계산합니다.
  2. 동적으로 렌더링되는 플랫폼 결합이 있는 모든 시계 침, 디지털 디스플레이 또는 정보 표시
  3. 소스 XML 파일에서 시계 침과 정보 표시 다음에 나열되는 모든 요소

일반적으로 대기 모드의 메모리 사용량은 대부분 비트맵 글꼴, 특히 큰 글꼴에서 비롯됩니다.

메모리 사용량을 줄이는 방법

이 섹션의 권장사항을 따르면 메모리 사용량이 이러한 한도 내에서 유지되는 시계 화면을 만들 가능성이 높아집니다.

비트맵 글꼴 자르기 및 크기 조절

이미지와 BitmapFont 객체를 자르고 디스플레이 크기에 맞게 크기를 조절하세요.

Wear OS에서 시계 화면을 그릴 때 모든 이미지가 압축 해제됩니다. 거의 비어 있는 전체 화면 이미지는 디스크에서 3KB를 사용할 수 있지만 450픽셀 x 450픽셀 화면에 표시되는 경우 시스템에서 이미지의 압축을 풀어 메모리에서 차지하는 이미지의 크기가 750KB 이상으로 증가합니다.

일관된 비트맵 글꼴 높이 사용

BitmapFont를 사용할 때는 캐릭터의 모든 이미지의 높이가 동일해야 합니다. 마찬가지로 단어의 모든 이미지도 각각 높이가 동일해야 합니다.

애니메이션에 일관된 프레임 크기 사용

시계 화면에서 이미지를 이동하는 대신 이미지 내의 요소를 업데이트하고 경계 상자를 시계 화면을 기준으로 동일한 위치에 유지합니다. 예를 들어 시계 화면에서 원을 애니메이션화하려면 시계 화면에서 원을 회전하는 대신 원의 색상을 변경해 보세요.

이 기법은 시스템에서 애니메이션에 대해 계산하는 경계 상자의 크기를 줄입니다.

이미지 중복 삭제

시계 화면에 동일한 이미지의 사본이 여러 개 표시되면 이미지의 사본 하나만 메모리에 로드하고 해당 이미지 하나를 여러 번 참조합니다.

원호를 사용하여 진행 상황 표시

1분 후 또는 1시간 후에 완료되는 진행률 표시줄을 에뮬레이션하려면 별도의 이미지 60개를 사용하지 마세요. 대신 다음 코드 스니펫과 같이 길이를 제어하는 표현식이 포함된 Arc 객체를 만듭니다.

<PartDraw angle="0" width="400" height="400" name="ProgressBar"
          pivotX="0.5" pivotY="0.5 x="40" y="40">
    <Arc centerX="200" centerY="200" width="400" height="400"
         startAngle="0" endAngle="360">
        <!-- Completes a "progress loop" every minute. -->
        <Transform target="endAngle"
                   value="0 + (clamp([SECOND], 0, 60) - 0) * 6" />
        <Stroke cap="ROUND" color="#123456" thickness="10" />
    </Arc>
</PartDraw>

예를 들어 레트로 디지털 시계 스타일의 모양을 얻기 위해 비연속 선을 표시하려면 Stroke 객체의 대시 속성이나 반투명 마스크 이미지 오버레이를 사용하세요.

시계 침과 정보 표시를 소스 파일의 끝에 배치

XML 노드는 소스 XML 파일에 나열된 순서대로 그려집니다. 시곗바늘과 정보 표시를 파일 끝에 배치하면 시스템이 대기 모드 메모리 계산에서 전체 레이어를 제거합니다.

시계 화면의 메모리 사용량 평가

시계 화면의 메모리 사용량을 측정하려면 GitHub의 watchface 저장소에 있는 메모리 사용량 평가 도구를 사용하세요.