Android 13부터 디스플레이 해상도가 변경될 때마다 클라이언트 구성 중에 사용되는 프레임 버퍼가 새로 할당됩니다. 이 할당은 해상도 변경 후 다음 무효화 주기에 SurfaceFlinger에서 실행합니다.
해상도 전환 중 프레임 버퍼 관리
해상도 변경은 다음 두 시나리오 중 하나로 인해 발생합니다.
하드웨어 컴포저(HWC)에서 초기화된 핫플러그 이벤트로, 하나의 외부 디스플레이에서 기본 해상도가 다른 외부 디스플레이로 교체할 때 발생합니다.
핫플러그 이벤트 중 기존 디스플레이 데이터가 할당 해제되면 기존 프레임 버퍼의 핸들이 해제됩니다.
SurfaceFlinger에 의해 시작된 디스플레이 모드 전환으로, 사용자가 사용자 설정으로 해상도를 변경하거나 앱이
preferredDisplayModeId
로 해상도를 변경하면 발생합니다.디스플레이 모드 전환 중
setActiveConfig
또는setActiveConfigWithConstraints
를 호출하기 전에 기존 클라이언트 프레임 버퍼의 핸들이 SurfaceFlinger에 의해 해제됩니다.
메모리 조각화와 같은 치명적인 문제를 피하려면 기존 프레임 버퍼와 새 프레임 버퍼를 위해 충분한 메모리를 예약하지 않는 기기에서는 다음 사례에서 보는 바와 같이 HWC가 기존 프레임 버퍼 사용을 중단하고 이러한 버퍼의 모든 핸들을 해제하는 것이 중요합니다.
핫플러그 이벤트의 경우:
onHotplug
호출 직전에모드 전환의 경우:
setActiveConfig
또는setActiveConfigWithConstraints
호출 직후
핸들을 해제하면 다음 무효화 주기 중 SurfaceFlinger가 새 프레임 버퍼를 할당하기 전에 프레임 버퍼 메모리를 완전히 할당 해제할 수 있습니다.
프레임 버퍼 관리를 위한 권장사항
HWC가 시간 내에 기존 프레임 버퍼의 핸들을 해제하지 않으면 새 프레임 버퍼 할당이 기존 프레임 버퍼 할당 해제 전에 발생합니다. 이런 경우 파편화 또는 다른 문제로 새 할당이 실패하면 치명적인 문제가 발생할 수 있습니다. 게다가 HWC에서 이러한 핸들을 전혀 해제하지 않으면 메모리 누수가 발생할 수 있습니다.
치명적인 할당 실패를 방지하려면 다음 권장사항을 따르세요.
새 클라이언트 프레임 버퍼가 제공될 때까지 HWC가 기존 클라이언트 프레임 버퍼를 계속 사용해야 하는 경우, 기존 프레임 버퍼 및 새 프레임 버퍼 모두를 위해 메모리를 충분히 예약하는 것이 중요하며 프레임 버퍼 메모리 공간에서 단편화 알고리즘을 실행할 수도 있습니다.
그래픽 버퍼 메모리의 나머지 부분에서 분리된 프레임 버퍼에 전용 메모리 풀을 할당합니다. 이는 프레임 버퍼를 할당 해제하고 재할당하는 사이에 서드 파티 프로세스가 그래픽 메모리 할당을 시도할 수 있으므로 중요합니다. 프레임 버퍼에서 같은 그래픽 메모리 풀을 사용하는 경우와 그래픽 메모리가 가득 찬 경우 서드 파티 프로세스는 이전에 프레임 버퍼에서 할당한 그래픽 메모리를 차지할 수 있으므로 프레임 버퍼 재할당(또는 메모리 공간 분할일 수도 있음)을 위한 메모리가 부족해집니다.
프레임 버퍼 관리 테스트
OEM은 다음 설명과 같이 기기의 해상도 전환에 관해 클라이언트 프레임 버퍼 메모리 관리를 적절하게 테스트하는 것이 좋습니다.
핫플러그 이벤트의 경우: 해상도가 다른 두 디스플레이의 연결을 해제했다가 다시 연결합니다.
모드 전환의 경우:
ModeSwitchingTestActivity
CTS 인증기 테스트를 사용하여 프레임 버퍼 메모리 동작을 테스트하는 모드 전환을 시작합니다. 이 테스트는 프로그래매틱 방식으로 감지하기 어려운 문제를 시각적으로 식별할 수 있습니다.