عکس‌های آنی تکلیف

نماگرفت‌های تکلیف زیرساختی است که در Android 8.0 معرفی شده است و نماگرفت‌ها را برای ریزعکس‌های اخیر و همچنین سطوح ذخیره‌شده از «مدیر پنجره» ترکیب می‌کند. «تصاویر کوچک اخیر» نشان‌دهنده آخرین وضعیت تکلیف در نمای «موارد اخیر» است.

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

معماری

دو مفهوم «ریزعکس‌های اخیر» و «سطوح ذخیره‌شده» با «عکس‌های آنی تکلیف» متحد می‌شوند. وقتی تکلیفی به پس‌زمینه می‌رود، «مدیر پنجره» نماگرفتی از این تکلیف را در GraphicBuffer قرار می‌دهد. تا زمانی که برنامه فعالیت برتر تکلیف در حافظه بماند، این GraphicBuffer در حافظه حفظ خواهد شد. اکنون، وقتی همان فعالیت دوباره به جلو آورده می‌شود، «مدیر پنجره» پنجره شروعی (TaskSnapshotSurface) ایجاد می‌کند و GraphicBuffer را بدون کپی کردن حافظه به صف بافر پنجره شروع پیوست می‌کند. به‌محض اینکه فعالیت اولین قاب خود را ترسیم کرد، پنجره شروع «عکس آنی تکلیف» به‌آرامی مانند صفحه‌های اسپلش معمولی محو می‌شود.

همین GraphicBuffer ازطریق Binder به SystemUI ارسال می‌شود تا برای رسم کردن وضعیت پیش‌نمایش تکلیف در نمای «برنامه‌های اخیر» استفاده شود. ازآنجایی‌که این فقط ارجاعی به میان‌گیر است، ارسال آن ازطریق binder منابع کمی مصرف می‌کند. وقتی GraphicBuffer به SystemUI می‌رسد، در یک Bitmap سخت‌افزاری پیچیده می‌شود و سپس بدون هیچ‌گونه بارگذاری حافظه در حافظه گرافیکی، روی صفحه کشیده می‌شود.

مزايا

این معماری جدید سه مزیت اصلی دارد:

  • اگر از عکس آنی تکلیف به‌عنوان پنجره شروع استفاده شود، محو تدریجی متقاطع خوبی بین عکس آنی و محتوای واقعی وجود دارد.
  • When the task snapshot is drawn in SystemUI, it can be done so without any copying. قبلاً باید بیت‌مپ در Ashmem و سپس در حافظه گرافیک کپی می‌شد. ازآنجایی‌که این روش تصویر لحظه‌ای را مستقیماً در حافظه گرافیکی ذخیره می‌کند، نیازی به کپی کردن نیست.
  • وضعیت‌هایی که در «موارد اخیر» می‌بینید همیشه با وضعیتی که هنگام باز کردن مجدد برنامه برای اولین‌بار می‌بینید مطابقت دارد. داشتن بافر یکسان در اینجا نیز باعث صرفه‌جویی در حافظه می‌شود. به همین دلیل است که «موارد اخیر» اکنون می‌تواند این تصاویر را با وضوح کامل نشان دهد. قبلاً، برای صرفه‌جویی در حافظه، ۶۴٪ نمونه‌برداری پایین انجام می‌شد.

پیاده‌سازی

این ویژگی کاملاً در پلاتفرم Android وجود دارد. نیازی به ادغام نیست و سفارشی‌سازی پشتیبانی نمی‌شود. بااین‌حال، سازندگان دستگاه می‌توانند ویژگی «عکس‌های آنی تکلیف» را کاملاً غیرفعال کنند.

برای غیرفعال کردن این ویژگی، این تابع را تغییر دهید:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

توجه داشته باشید که اگر این ویژگی غیرفعال باشد، نمای «موارد اخیر» هیچ ریزعکسی را نشان نخواهد داد.

عکس‌های آنی با وضوح بالا و پایین

خلاصه‌های تکلیف در دو مقیاس روی دیسک نوشته می‌شوند. هنگام بازیابی کردن چرک‌نویس تکلیف از دیسک، ابتدا چرک‌نویس‌های با وضوح پایین خوانده می‌شوند و سپس با چرک‌نویس‌های با وضوح بالای خود جایگزین می‌شوند. این بهینه‌سازی زمان بار شدن تصویر را بهبود می‌بخشد. درغیراین‌صورت، ممکن است هنگام خواندن فایل عکس آنی از دیسک تأخیر کوچکی وجود داشته باشد و کاربر تا زمانی که تصویر دردسترس قرار گیرد، کارت تکلیف خالی ببیند. با تنظیم config_highResTaskSnapshotScale و config_lowResTaskSnapshotScale می‌توانید مقیاس‌ها را در فایل پیکربندی رونهاد دستگاه overlay/frameworks/base/core/res/res/values/config.xml پیکربندی کنید. به‌طور پیش‌فرض، این تنظیمات به‌ترتیب روی ۱.۰ و ۰.۵ تنظیم شده‌اند. با تنظیم کردن config_lowResTaskSnapshotScale روی ۰٫۰، عکس‌های فوری با وضوح پایین را غیرفعال کنید.

مثال‌ها و منبع

بقیه کد این ویژگی را در فایل‌های TaskSnapshot* در اینجا پیدا کنید:

frameworks/base/+/android17-release/services/core/java/com/android/server/wm/