그래픽 스택에서 레이어별 버퍼 캐시는 IPC를 통해 파일 설명자를 전송하는 데 드는 오버헤드를 줄이기 위해 Composer HAL과 SurfaceFlinger 사이에 존재합니다. Android 14 이전에는 MediaCodec이 SurfaceView에서 연결 해제될 때와 같이 GraphicBufferProducer
가 SurfaceFlinger GraphicBufferConsumer
에서 연결 해제될 때 이 버퍼 캐시가 삭제되지 않았습니다. Android 14부터는 그래픽 메모리 소비를 줄이기 위해 이 버퍼 캐시를 강제로 삭제할 수 있습니다.
다음 두 가지 옵션 중 하나를 선택하세요.
- Android 14 이상을 실행하는 기기의 경우 Composer HAL API 버전 3.2를 새로 구현해야 합니다. 이 옵션은 기본적으로 활성화되며 가장 많은 메모리가 절약됩니다. Android 14 이상으로 업그레이드하는 기기도 이 옵션을 사용하여 메모리의 이점을 모두 얻을 수 있습니다.
- Composer HAL 3.2 API를 구현하지 않고 Android 14로 업그레이드하는 기기는 하위 호환성 옵션을 사용 설정하면 됩니다. 이 옵션은 이전 옵션과 거의 비슷한 양의 메모리를 절약합니다.
다음 두 섹션은 각 옵션을 구현하는 방법을 설명합니다.
Composer HAL 3.2 API 구현
그래픽 버퍼 메모리의 이점을 모두 얻으려면 다음을 실행해야 합니다.
- Composer HAL 구현을 3.2 버전으로 업데이트합니다.
- 목록에 있는 슬롯 번호로 표시된 버퍼 캐시 항목을 삭제하여
LayerCommand::bufferSlotsToClear
를 처리합니다.
LayerCommand:bufferSlotsToClear
를 포함하여 그래픽 버퍼 메모리와 관련된 Composer HAL 3.2 API는 LayerCommand.aidl-
에 있습니다.
하위 호환성 옵션 사용 설정
하위 호환성 메모리 감소 옵션은 캐시 슬롯에 있는 실제 버퍼를 1x1 자리표시자 버퍼로 대체하며, 그 결과 삭제된 모든 슬롯의 메모리가 절약됩니다(현재 활성 상태의 버퍼 슬롯 제외). 메모리 절약의 이점을 일부 얻으려면 surface_flinger.clear_slots_with_set_layer_buffer
sysprop를 true
로 설정하여 하위 호환 옵션을 사용 설정하면 됩니다. 이 sysprop는 property_contexts
파일에서 찾을 수 있습니다.
이 sysprop를 설정하려면 현재 단일 주기의 동일 레이어에 대해 여러 setLayerBuffer
명령어를 올바르게 처리할 수 있도록 Composer HAL을 구현해야 합니다.
하위 호환성 옵션을 사용 설정하면 다음과 같은 영향이 있습니다.
AIDL HAL: SurfaceFlinger가 단일 레이어에 여러
LayerCommand
인스턴스를 전송합니다. 각 인스턴스에는 하나의BufferCommand
가 포함됩니다. 각BufferCommand
에는 1x1 자리표시자 버퍼 핸들과 삭제해야 하는 캐시 버퍼 슬롯의 슬롯 번호가 포함됩니다.HIDL HAL: SurfaceFlinger가 여러
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
명령어를 전송합니다. 이러한 명령어에는 1x1 자리표시자 버퍼 핸들과 삭제해야 하는 캐시 버퍼 슬롯의 슬롯 번호가 포함됩니다.
일부 기기에서는 하위 호환성 옵션으로 인해 Composer HAL이 다운될 수 있습니다. Composer HAL을 수정해서 이 문제를 해결할 수도 있습니다. 이 동작을 제어하는 코드는 아래에서 찾을 수 있습니다.
그래픽 버퍼 캐시 메모리 소비 테스트
HAL 구현으로 캐시 슬롯이 삭제되었는지는 테스트로 확인할 수 없습니다. 그러나 디버깅 도구를 사용하여 그래픽 버퍼 사용량을 모니터링할 수는 있습니다. 사용량을 모니터링하면 YouTube에서 여러 다른 동영상을 빠르게 연달아 중지하고 시작하는 시나리오에서 메모리 부족 오류가 더 적어진 것을 알 수 있습니다.
VTS 테스트는 HAL 구현이 하위 호환성 구현을 위해 기능적으로 새 API 호출(HAL 버전 3.2 이상) 또는 여러 setLayerBuffer
명령어를 수신할 수 있는지 확인할 수 있습니다. 하지만, 일부 기기는 이러한 VTS 테스트를 통과하더라도 실제 사용 사례에서 실패가 발생하므로 정상적인 작동을 위해 충분한 테스트가 이루어졌다고 할 수 없습니다.
새 VTS 테스트를 실행하려면 다음 링크로 이동합니다.
HIDL과 호환됨:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
AIDL 3.1과 호환됨:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear