از 27 مارس 2025، توصیه می کنیم از android-latest-release به جای aosp-main برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
در پشته گرافیکی، یک کش بافر در هر لایه بین Composer HAL و SurfaceFlinger قرار میگیرد تا سربار مربوط به ارسال توصیفگرهای فایل از طریق IPC را کاهش دهد. قبل از Android 14، هنگامی که یک GraphicBufferProducer از SurfaceFlinger GraphicBufferConsumer جدا میشود، این کش بافر پاک نمیشد، مانند زمانی که MediaCodec از SurfaceView قطع میشود. با شروع اندروید 14، میتوانید این کش بافر را به اجبار پاک کنید تا مصرف حافظه گرافیکی را کاهش دهید.
یکی از دو گزینه زیر را انتخاب کنید:
برای دستگاههایی که با Android 14 و بالاتر راهاندازی میشوند، باید Composer HAL API جدید نسخه 3.2 را پیادهسازی کنید. این گزینه به صورت پیش فرض فعال است و بیشترین ذخیره حافظه را ذخیره می کند. دستگاه های ارتقا یافته به 14 و بالاتر نیز می توانند از این گزینه برای دستیابی به مزایای حافظه کامل استفاده کنند.
برای دستگاههایی که به Android 14 ارتقا مییابند و نمیخواهید Composer HAL 3.2 API را برای آنها پیادهسازی کنید، میتوانید گزینه سازگار با عقب را فعال کنید. این گزینه تقریباً به اندازه گزینه قبلی حافظه ذخیره می کند.
دو بخش زیر نحوه پیاده سازی هر گزینه را توضیح می دهد.
API Composer HAL 3.2 را پیاده سازی کنید
برای دستیابی به مزایای کامل حافظه بافر گرافیکی، باید:
پیاده سازی Composer HAL خود را به نسخه 3.2 به روز کنید.
Process LayerCommand::bufferSlotsToClear با پاک کردن ورودی های حافظه پنهان بافر که با شماره های اسلات موجود در لیست مشخص شده اند.
API های Composer HAL 3.2 مربوط به حافظه بافر گرافیکی، از جمله LayerCommand:bufferSlotsToClear ، در LayerCommand.aidl- هستند.
گزینه backward-compatible را فعال کنید
گزینه کاهش حافظه سازگار با عقب، یک بافر واقعی در شکاف حافظه پنهان را با یک بافر نگهدارنده 1×1 جایگزین می کند، که منجر به صرفه جویی در حافظه برای همه اسلات های پاک شده، به جز اسلات بافر فعال فعلی می شود. برای دستیابی به مزایای صرفه جویی جزئی حافظه، گزینه سازگار با عقب را با تنظیم sysprop surface_flinger.clear_slots_with_set_layer_buffer روی true فعال کنید. این sysprop در فایل property_contexts یافت می شود.
تنظیم این sysprop به پیاده سازی Composer HAL شما نیاز دارد که چندین دستور setLayerBuffer برای یک لایه در یک چرخه فعلی به درستی مدیریت کند.
فعال کردن گزینه backward-compatible اثرات زیر را دارد:
برای HAL های AIDL: 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 را پشت سر میگذارند، اما در موارد استفاده در دنیای واقعی شکست میخورند.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Reduce graphics memory consumption\n\nIn the graphics stack, a per-layer buffer cache sits between Composer HAL and\nSurfaceFlinger to reduce the overhead associated with sending file descriptors\nover IPC. Prior to Android 14, this buffer cache\nwasn't purged when a\n[`GraphicBufferProducer`](https://android.googlesource.com/platform/frameworks/native/+/android16-release/libs/gui/include/gui/IGraphicBufferProducer.h) disconnects from a SurfaceFlinger\n[`GraphicBufferConsumer`](https://android.googlesource.com/platform/frameworks/native/+/android16-release/libs/gui/include/gui/IGraphicBufferConsumer.h), such as when a\nMediaCodec is disconnected from a SurfaceView. Starting with Android\n14, you can forcefully purge this buffer cache to\nreduce graphics memory consumption.\n| **Note:** The benefits of this feature are most apparent when a user is starting and stopping videos within an app on a device with a high-resolution display and limited memory, such as a television.\n\nChoose from one of the two following options:\n\n- For devices launching with Android 14 and higher, you must implement the new Composer HAL API version 3.2. This option is activated by default and saves the most memory. Devices upgrading to 14 and later can also use this option to achieve full memory benefits.\n- For devices upgrading to Android 14 for which you don't want to implement Composer HAL 3.2 API, you can enable the backward-compatible option. This option saves almost as much memory as the previous option.\n\nThe following two sections explain how to implement each option.\n\nImplement the Composer HAL 3.2 API\n----------------------------------\n\nTo achieve full graphics buffer memory benefits, you must:\n\n1. Update your Composer HAL implementation to version 3.2.\n2. Process `LayerCommand::bufferSlotsToClear` by purging buffer cache entries indicated by the slot numbers found in the list.\n\nThe Composer HAL 3.2 APIs related to graphic buffer memory, including\n`LayerCommand:bufferSlotsToClear`, are in\n[`LayerCommand.aidl-`](https://cs.android.com/android/platform/superproject/+/android-latest-release:hardware/interfaces/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl).\n\nEnable the backward-compatible option\n-------------------------------------\n\nThe backward-compatible memory reduction option replaces a real buffer in\nthe cache slot with a 1x1 placeholder buffer, resulting in memory savings\nfor all purged slots, except for the current active buffer slot. To achieve\npartial memory saving benefits, enable the backward-compatible option by\nsetting the `surface_flinger.clear_slots_with_set_layer_buffer` sysprop to\n`true`. This sysprop is found in the\n[`property_contexts`](https://cs.android.com/android/platform/superproject/+/android-latest-release:system/sepolicy/private/property_contexts?q=%22surface_flinger.clear_slots_with_set_layer_buffer%22)\nfile.\n\nSetting this sysprop requires your Composer HAL implementation to correctly\nhandle multiple `setLayerBuffer` commands for the same layer in a single\npresent cycle.\n\nEnabling the backward-compatible option has the following affects:\n\n- For AIDL HALs: SurfaceFlinger sends multiple `LayerCommand` instances for a\n single layer, each with a single `BufferCommand`. Each `BufferCommand` contains a 1x1\n placeholder buffer handle and a slot number for the cache buffer slot that\n needs to be purged.\n\n- For HIDL HALs: SurfaceFlinger sends multiple `SELECT_DISPLAY`,\n `SELECT_LAYER`, `SET_BUFFER` commands. These commands contain a 1x1 placeholder\n buffer handle and a slot number for the cache buffer slot that needs to be\n purged.\n\nThe backward-compatible option might cause the Composer HAL to crash on some\ndevices. You might be able to modify your Composer HAL to solve this issue. The\ncode controlling this behavior is found here:\n\n- [SurfaceFlinger code for AIDL HALs](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp#854)\n\n- [SurfaceFlinger code for HIDL HALs](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp#718)\n\nTest graphics buffer cache memory consumption\n---------------------------------------------\n\nTests can't verify whether the cache slots are purged by HAL\nimplementations. However, you can use your debugging tools to monitor\ngraphic buffer usage. As you monitor, you should notice that there are fewer\nout-of-memory errors in scenarios where multiple different videos are stopped\nand started in quick succession on YouTube.\n\nVTS tests are available that verify that the HAL implementation is\nfunctionally capable of receiving the new API calls (HAL version 3.2+) or\nmultiple `setLayerBuffer` commands for the backward-compatible\nimplementation. However, this shouldn't be considered sufficient testing for\nproper functionality, as some devices pass these VTS tests,\nbut fail during real-world use cases.\n\nFor new VTS tests, navigate to the following links:\n\n- HIDL compatible: [`GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp#891)\n\n- AIDL 3.1 compatible: [`GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp#1817)\n\n- AIDL 3.2: [`GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp#1770)"]]