با شروع از اندروید ۱۳، سیستم هر زمان که وضوح صفحه نمایش تغییر کند، فریمبافرهای جدیدی را که در طول ترکیب کلاینت استفاده میشوند، اختصاص میدهد. SurfaceFlinger این تخصیص را در چرخه نامعتبرسازی بعدی پس از تغییر وضوح انجام میدهد.
مدیریت فریمبافر در طول سوئیچهای رزولوشن
تغییرات وضوح تصویر به دلیل یکی از دو سناریوی زیر رخ میدهد:
یک رویداد hotplug که توسط Hardware Composer (HWC) آغاز میشود و هنگام تعویض از یک نمایشگر خارجی به یک نمایشگر خارجی دیگر که وضوح پیشفرض متفاوتی دارد، رخ میدهد.
در طول یک رویداد hotplug، HWC هنگام آزادسازی دادههای نمایشگر قدیمی، دستگیرههای بافرهای فریم قدیمی را آزاد میکند.
یک تغییر حالت نمایش که توسط SurfaceFlinger آغاز میشود و زمانی رخ میدهد که شما وضوح تصویر را با استفاده از تنظیمات کاربر تغییر میدهید، یا یک برنامه وضوح تصویر را با استفاده از
preferredDisplayModeId
تغییر میدهد.در طول تغییر حالت نمایش، SurfaceFlinger قبل از فراخوانی
setActiveConfig
یاsetActiveConfigWithConstraints
، دستگیرهها را به framebufferهای کلاینت موجود آزاد میکند.
برای جلوگیری از مشکلات فاجعهباری مانند تکهتکه شدن حافظه در دستگاههایی که حافظه فریمبافر کافی ندارند، HWC باید هندلها را به فریمبافرهای قدیمی آزاد کند. این امر در موارد زیر بسیار مهم است:
برای رویدادهای hotplug، بلافاصله قبل از فراخوانی
onHotplug
.برای تغییر حالت، بلافاصله پس از فراخوانی
setActiveConfig
یاsetActiveConfigWithConstraints
.
رها کردن دستگیرهها به حافظه فریمبافر اجازه میدهد تا قبل از اینکه SurfaceFlinger فریمبافرهای جدیدی را در طول چرخه نامعتبرسازی بعدی اختصاص دهد، بهطور کامل آزاد شود.
توصیههایی برای مدیریت فریمبافر
اگر HWC به موقع دستگیرههای فریمبافرهای قدیمی را آزاد نکند، تخصیص فریمبافر جدید قبل از آزادسازی فریمبافر قدیمی اتفاق میافتد. این امر میتواند در صورت عدم موفقیت تخصیص جدید به دلیل قطعه قطعه شدن یا سایر مشکلات، مشکلات فاجعهباری ایجاد کند. حتی بدتر از آن، اگر HWC اصلاً این دستگیرهها را آزاد نکند، ممکن است نشت حافظه رخ دهد.
برای جلوگیری از شکستهای فاجعهبار در تخصیص، این توصیهها را دنبال کنید:
اگر HWC نیاز داشته باشد که تا زمان ارائه فریم بافرهای جدید کلاینت، به استفاده از فریم بافرهای کلاینت قدیمی ادامه دهد، بسیار مهم است که حافظه کافی برای فریم بافرهای قدیمی و جدید رزرو شود و در صورت امکان الگوریتمهای یکپارچهسازی روی فضای حافظه فریم بافر اجرا شود.
یک مخزن حافظه اختصاصی برای فریمبافرها اختصاص دهید که از بقیه حافظه بافر گرافیکی جدا باشد. این مهم است زیرا یک فرآیند شخص ثالث ممکن است سعی کند حافظه گرافیکی را بین تخصیص مجدد و تخصیص مجدد فریمبافر اختصاص دهد. اگر فریمبافر از همان مخزن حافظه گرافیکی استفاده کند و اگر حافظه گرافیکی پر باشد، فرآیند شخص ثالث میتواند حافظهای را که قبلاً توسط یک فریمبافر اختصاص داده شده بود، اشغال کند. این میتواند منجر به حافظه ناکافی برای تخصیص مجدد فریمبافر یا تکهتکه شدن حافظه شود.
مدیریت فریم بافر را آزمایش کنید
به تولیدکنندگان تجهیزات اصلی (OEM) توصیه میشود که مدیریت صحیح حافظه فریمبافر کلاینت را در سوئیچهای رزولوشن دستگاه خود، که به شرح زیر است، آزمایش کنند:
برای رویدادهای اتصال سریع (hotplug)، دو نمایشگر مختلف که وضوح تصویر متفاوتی دارند را از برق بکشید و دوباره وصل کنید.
برای تغییر حالت، از تست
ModeSwitchingTestActivity
CTS Verifier برای شروع تغییر حالت جهت آزمایش رفتار حافظه فریم بافر استفاده کنید. این تست میتواند مشکلاتی را که تشخیص آنها از طریق برنامهنویسی دشوار است، به صورت بصری شناسایی کند.