کاهش مصرف حافظه گرافیکی

در پشته گرافیک، حافظه نهان بافر لایه‌ای بین Composer HAL و SurfaceFlinger قرار دارد تا سربار مرتبط با ارسال توصیفگرهای فایل ازطریق IPC را کاهش دهد. قبل‌از Android 14، وقتی GraphicBufferProducer از GraphicBufferConsumer SurfaceFlinger قطع اتصال می‌کند، برای مثال وقتی MediaCodec از SurfaceView قطع اتصال می‌کند، سیستم این حافظه نهان بافر را پاک نمی‌کرد. از Android 14 به بعد، می‌توانید این حافظه نهان میان‌گیر را به‌اجبار پاک کنید تا مصرف حافظه نماپردازنده کاهش یابد.

یکی از دو گزینه زیر را انتخاب کنید:

  • برای دستگاه‌هایی که با Android 14 و بالاتر عرضه می‌شوند، باید Composer HAL API جدید نسخه ۳.۲ را پیاده‌سازی کنید. این گزینه به‌طور پیش‌فرض فعال می‌شود و حداکثر میزان حافظه را ذخیره می‌کند. دستگاه‌هایی که به نسخه ۱۴ و بالاتر ارتقا می‌یابند نیز می‌توانند از این گزینه برای بهره‌مندی کامل از مزایای حافظه استفاده کنند.
  • برای دستگاه‌هایی که به Android 14 ارتقا می‌یابند و نمی‌خواهید «میانای برنامه‌سازی کاربردی» Composer HAL 3.2 را در آن‌ها پیاده‌سازی کنید، می‌توانید گزینه پس‌سازگار را فعال کنید. این گزینه تقریباً به‌اندازه گزینه قبلی در مصرف حافظه صرفه‌جویی می‌کند.

دو بخش زیر نحوه پیاده‌سازی هر گزینه را توضیح می‌دهد.

پیاده‌سازی Composer HAL 3.2 API

برای بهره‌مندی از تمام مزایای حافظه میان‌گیر گرافیک، باید:

  1. پیاده‌سازی Composer HAL را به نسخه ۳.۲ به‌روز کنید.
  2. پردازش LayerCommand::bufferSlotsToClear با پاک‌سازی ورودی‌های حافظه نهان میان‌گیر که با شماره‌های جایگاه موجود در فهرست نشان داده شده است.

میاناهای برنامه‌سازی کاربردی Composer HAL 3.2 مربوط به حافظه بافر گرافیکی، ازجمله LayerCommand::bufferSlotsToClear، در فایل LayerCommand.aidl قرار دارند.

گزینه سازگار با نسخه قدیمی را فعال کنید

گزینه کاهش حافظه سازگار با عقب، بافر واقعی را در جایگاه حافظه نهان با بافر جای‌بان ۱×۱ جایگزین می‌کند. این کار باعث صرفه‌جویی در حافظه برای همه جایگاه‌های پاک‌شده می‌شود، به‌جز جایگاه میان‌گیر فعال فعلی. برای دستیابی به مزایای صرفه‌جویی جزئی در حافظه، با تنظیم surface_flinger.clear_slots_with_set_layer_buffer sysprop روی true، گزینه سازگار با نسخه قدیمی را فعال کنید. این sysprop در فایل property_contexts پیدا می‌شود.

برای تنظیم این sysprop، پیاده‌سازی Composer HAL شما باید چندین فرمان setLayerBuffer را برای لایه یکسان در یک چرخه نمایش به‌درستی مدیریت کند.

فعال کردن گزینه سازگار با نسخه قدیمی تأثیرات زیر را دارد:

  • برای AIDL HAL: SurfaceFlinger چندین نمونه LayerCommand را برای یک لایه واحد ارسال می‌کند که هرکدام یک BufferCommand دارند. هر BufferCommand حاوی دستگیره بافر جای‌بان ۱x۱ و شماره جایگاه برای جایگاه بافر حافظه نهان است که نیاز به پاک‌سازی دارد.

  • برای HIDL HAL: ‏ SurfaceFlinger چندین فرمان SELECT_DISPLAY, SELECT_LAYER، SET_BUFFER ارسال می‌کند. این فرمان‌ها حاوی یک دسته بافر جای‌بان ۱×۱ و یک شماره جایگاه برای جایگاه بافر پنهان است که باید پاک‌سازی شود.

گزینه سازگار با نسخه قدیمی ممکن است باعث ازکارافتادن Composer HAL در برخی‌از دستگاه‌ها شود. شاید بتوانید Composer HAL را برای حل این مشکل اصلاح کنید. کد کنترل‌کننده این رفتار در اینجا قرار دارد:

آزمایش مصرف حافظه نهان میان‌گیری گرافیک

آزمایش‌ها نمی‌توانند درستی‌سنجی کنند که آیا پیاده‌سازی‌های HAL جایگاه‌های حافظه نهان را پاکسازی می‌کنند یا نه. بااین‌حال، می‌توانید از ابزارهای اشکال‌زدایی برای نظارت بر استفاده از بافر گرافیکی استفاده کنید. همان‌طور که نظارت می‌کنید، ممکن است متوجه شوید که خطاهای کمبود حافظه در سناریوهایی که چندین ویدیو مختلف به‌سرعت در YouTube متوقف و شروع می‌شوند، کاهش یافته است.

آزمایش‌های VTS دردسترس است که درستی‌سنجی می‌کند پیاده‌سازی HAL ازنظر عملکردی قادر به دریافت فراخوانی‌های جدید میانای برنامه‌سازی کاربردی (نسخه HAL 3.2+) یا چندین فرمان setLayerBuffer برای پیاده‌سازی سازگار با عقب است. بااین‌حال، این نباید به‌عنوان آزمایش کافی برای عملکرد صحیح درنظر گرفته شود، زیرا برخی‌از دستگاه‌ها این آزمایش‌های VTS را می‌گذرانند، اما در موارد استفاده واقعی با مشکل مواجه می‌شوند.

برای آزمون‌های جدید VTS، پیوندهای زیر را ببینید: