آهنگ مصرف قاب

کتابخانه «گام‌بندی قاب Android»، که با نام Swappy نیز شناخته می‌شود، بخشی از کیت توسعه نرم‌افزار بازی Android است. این کتابخانه به بازی‌های OpenGL و Vulkan کمک می‌کند تا در Android به پرداز هموار و سرعت قاب صحیح دست یابند.

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

  • میان‌گیری قاب‌های گذشته به‌صورت داخلی
  • تشخیص ارسال‌های دیرهنگام قاب
  • ادامه نمایش قاب فعلی وقتی قاب دیرهنگام تشخیص داده می‌شود

زمان‌های نمایش فریم ناسازگار به‌دلیل اجرای حلقه پردازش بازی با نرخی متفاوت از آنچه سخت‌افزار نمایشگر بومی پشتیبانی می‌کند ایجاد می‌شود. مشکلات زمانی به‌وجود می‌آیند که حلقه رندر بازی برای سخت‌افزار نمایشگر زیرین خیلی کند اجرا شود و منجر به زمان‌های نمایشگر ناسازگار شود. برای مثال، وقتی بازی‌ای که با نرخ ۳۰ فریم در ثانیه اجرا می‌شود تلاش می‌کند در دستگاهی که به‌طور بومی از نرخ ۶۰ فریم در ثانیه پشتیبانی می‌کند پرداز شود، حلقه پرداز بازی باعث می‌شود یک قاب تکراری به‌مدت ۱۶ میلی‌ثانیه اضافی در صفحه نمایش باقی بماند. این نوع عدم تطابق باعث ایجاد ناهمگونی‌های قابل‌توجه در زمان‌های قاب می‌شود، مثل ۳۳ میلی‌ثانیه، ۱۶ میلی‌ثانیه، و ۴۹ میلی‌ثانیه. صحنه‌های بیش‌ازحد پیچیده این مشکل را بیشتر می‌کنند زیرا باعث می‌شوند قاب‌ها ازدست بروند.

کتابخانه Frame Pacing این وظایف را انجام می‌دهد:

  • به‌دلیل قاب‌های کوتاه بازی، لکنت را جبران می‌کند.
    • مُهرهای زمان ارائه را اضافه می‌کند تا قاب‌ها به‌موقع ارائه شوند، نه زودتر.
    • از افزونه‌های مُهر زمان ارائه EGL_ANDROID_presentation_time و VK_GOOGLE_display_timing استفاده می‌کند.
  • از حصارهای همگام‌سازی برای قاب‌های طولانی که منجر به لکنت و تأخیر می‌شوند استفاده می‌کند.
    • وقفه‌هایی را به برنامه تزریق می‌کند. این وقفه‌ها به خط لوله نمایش اجازه می‌دهد به‌جای ایجاد فشار برگشتی، خود را به‌روز کند.
    • از حصارهای همگام‌سازی (EGL_KHR_fence_sync و VkFence) استفاده می‌کند.
  • اگر دستگاهتان از چند نرخ بازآوری پشتیبانی کند، نرخ بازآوری‌ای را انتخاب می‌کند که انعطاف‌پذیری و ارائه روانی را فراهم کند.
  • بااستفاده از آمار قاب، آمار اشکال‌زدایی و نمایه‌بندی را ارائه می‌دهد.

برای آشنایی با نحوه پیکربندی کتابخانه برای کار کردن در حالت‌های مختلف براساس نیازتان، به حالت‌های عملیاتی پشتیبانی‌شده مراجعه کنید.

برای پیاده‌سازی بااستفاده از موتور پردازکننده OpenGL یا موتور پردازکننده Vulkan، به موارد زیر مراجعه کنید:

برای مطالعه بیشتر، به کتابخانه Frame Pacing مراجعه کنید.

مداخله محدودسازی فریم در ثانیه

مداخله محدودسازی فریم در ثانیه (FPS) به بازی‌ها امکان می‌دهد تا فقط بااستفاده از تغییرات سمت پلتفرم و بدون نیاز به هیچ اقدامی ازسوی توسعه‌دهندگان، با FPS مناسبی اجرا شوند.

پیاده‌سازی مداخله محدودسازی FPS از عناصر زیر استفاده می‌کند.

GameManagerService

جزء GameManagerService همه اطلاعات مربوط به هر کاربر و هر بازی را درباره حالت بازی و مداخله بازی حفظ می‌کند. اطلاعات FPS در GameManagerService همراه با اطلاعات مداخله دیگر، مثل عامل کاهش مقیاس وضوح، در <PACKAGE_NAME, Interventions> نگاشت برای هر نمایه کاربر ذخیره می‌شود. وقتی حالت بازی تغییر می‌کند یا مداخله به‌روز می‌شود، به اطلاعات FPS دسترسی پیدا می‌شود. UID برای هر PACKAGE_NAME و کاربر منحصربه‌فرد است و می‌تواند به جفت <UID, Frame Rate> ترجمه شود تا به SurfaceFlinger ارسال شود.

SurfaceFlinger

عنصر SurfaceFlinger ازقبل از محدود کردن «نرخ فریم» برنامه پشتیبانی می‌کند، به‌شرطی که نرخ فریم بر نرخ بازآوری نمایشگر بخش‌پذیر باشد. درصورت وقوع VSync،‏ SurfaceFlinger اعتبار VSync را برای برنامه محدودشده با تأیید اینکه مُهر زمان VSync با نرخ فریم برنامه هم‌فاز است بررسی می‌کند. اگر نرخ فریم با VSync هم‌فاز نباشد، SurfaceFlinger قاب را نگه می‌دارد تا زمانی که نرخ فریم و VSync هم‌فاز شوند.

شکل زیر تعامل بین GameManagerService و SurfaceFlinger را شرح می‌دهد:

تعامل بین GameManagerService و SurfaceFlinger

شکل ۱. تعامل بین GameServiceManager و SurfaceFlinger.

‫SurfaceFinger یک جفت <UID, Frame Rate> را برای نگاشت حفظ می‌کند تا اولویت محدودسازی نرخ فریم جدیدی را تنظیم کند. UID بین کاربران و بازی‌ها منحصربه‌فرد است، بنابراین هر کاربر در یک دستگاه می‌تواند تنظیمات نرخ فریم متفاوتی برای یک بازی داشته باشد. برای محدود کردن نرخ فریم بازی، GameManagerService با SurfaceFlinger تماس می‌گیرد تا نرخ فریم را برای UID ملغی کند. با این سازوکار، هرگاه حالت بازی تغییر کند یا مداخله به‌روز شود، SurfaceFlinger نگاشت را به‌روز می‌کند. SurfaceFlinger تغییر FPS را با قفل کردن میان‌گیرها به‌طور مناسب مدیریت می‌کند.

برای درک بیشتر درباره محدودسازی FPS، به محدودسازی FPS مراجعه کنید.