کتابخانه Android Frame Pacing که با نام Swappy نیز شناخته میشود، بخشی از Android Game SDK است. این به بازیهای OpenGL و Vulkan کمک میکند تا به رندرینگ روان و تنظیم فریم صحیح در اندروید دست یابند.
فریم ریتم همگام سازی منطق و حلقه رندر بازی با زیرسیستم نمایشگر سیستم عامل و سخت افزار نمایشگر زیرین است. زیرسیستم نمایشگر اندروید برای جلوگیری از برخی مصنوعات بصری مانند پاره شدن طراحی شده است. زیرسیستم نمایشگر با انجام کارهای زیر از پاره شدن جلوگیری می کند:
- بافر کردن فریم های گذشته به صورت داخلی
- شناسایی فریم های ارسالی دیرهنگام
- در صورت شناسایی فریم دیررس، نمایش فریم فعلی ادامه می یابد
زمانهای نمایش فریم متناقض به دلیل اجرای حلقه رندر بازی با نرخ متفاوتی نسبت به آنچه سختافزار نمایش بومی پشتیبانی میکند، ایجاد میشود. هنگامی که حلقه رندر بازی برای سخت افزار نمایشگر زیرین بسیار آهسته اجرا می شود، مشکلات ایجاد می شود که منجر به زمان نمایش متناقض می شود. به عنوان مثال، وقتی یک بازی با سرعت 30 فریم در ثانیه اجرا میشود، سعی میکند روی دستگاهی که به طور بومی از 60 فریم در ثانیه پشتیبانی میکند، رندر بگیرد، حلقه رندر بازی باعث میشود یک فریم تکراری به مدت 16 میلیثانیه اضافی روی صفحه باقی بماند. این نوع قطع، ناهماهنگی های قابل توجهی در زمان های فریم مانند 33 ms، 16 ms، 49 ms و غیره ایجاد می کند. صحنه های بیش از حد پیچیده این مشکل را تشدید می کند زیرا باعث می شود فریم های از دست رفته رخ دهد.
کتابخانه Frame Pacing این وظایف را انجام می دهد:
- لکنت ناشی از فریم های کوتاه بازی را جبران می کند.
- مهرهای زمانی ارائه را اضافه می کند تا فریم ها به موقع ارائه شوند، نه زودتر.
- از پسوندهای مهر زمان ارائه
EGL_ANDROID_presentation_time
وVK_GOOGLE_display_timing
استفاده می کند.
- از نرده های همگام برای فریم های بلند استفاده می کند که منجر به لکنت و تاخیر می شود.
- انتظارها را به برنامه تزریق می کند. اینها به خط لوله نمایشگر اجازه میدهند به جای افزایش فشار برگشتی، عقب بیفتد.
- از نرده های همگام سازی (
EGL_KHR_fence_sync
وVkFence
) استفاده می کند.
- اگر دستگاه شما از چند نرخ بهروزرسانی پشتیبانی میکند، نرخ تازهسازی را برای ارائه انعطافپذیری و ارائه روان انتخاب میکند.
- با استفاده از آمار فریم ، آماری را برای اشکال زدایی و نمایه سازی ارائه می دهد.
برای یادگیری نحوه پیکربندی کتابخانه برای عملکرد در حالتهای مختلف با توجه به آنچه نیاز دارید، به حالتهای عملیاتی پشتیبانی شده مراجعه کنید.
برای پیاده سازی با استفاده از رندر OpenGL یا رندر Vulkan، نگاه کنید
- Android Frame Pacing را در رندر OpenGL خود ادغام کنید
- Android Frame Pacing را در رندر Vulkan خود ادغام کنید
برای خواندن بیشتر، به دستیابی به سرعت قاب مناسب مراجعه کنید.
فریم در ثانیه مداخله گاز
فریم در ثانیه (FPS) به بازیها اجازه میدهد تا با استفاده از تغییرات جانبی پلتفرم و بدون نیاز به هیچ اقدامی از سوی توسعهدهندگان، با سرعت FPS مناسب حرکت کنند.
اجرای مداخله throttling FPS از اجزای زیر استفاده می کند:
سرویس GameManager
مؤلفه GameManagerService تمام اطلاعات هر کاربر و هر بازی مربوط به حالت بازی و مداخله بازی را حفظ می کند. اطلاعات FPS در GameManagerService همراه با سایر اطلاعات مداخله مانند ضریب کاهش مقیاس رزولوشن در نقشه <PACKAGE_NAME, Interventions>
برای هر نمایه کاربر ذخیره می شود. هنگامی که حالت بازی تغییر می کند یا مداخله به روز می شود، به اطلاعات FPS دسترسی پیدا می کند. یک UID
برای هر PACKAGE_NAME
و کاربر منحصر به فرد است و میتواند به یک جفت <UID, Frame Rate>
برای ارسال به SurfaceFlinger ترجمه شود.
سرفیس فلینگر
کامپوننت SurfaceFlinger در حال حاضر از مهار کردن FPS یک برنامه پشتیبانی میکند تا زمانی که نرخ فریم یک مقسومکننده بر نرخ تازهسازی نمایشگر باشد. در صورت vsync، SurfaceFlinger اعتبار vsync را برای برنامه throttled با بررسی اینکه آیا مهر زمانی vsync با نرخ فریم برنامه مطابقت دارد، بررسی میکند. اگر نرخ فریم با vsync هم فاز نباشد، SurfaceFlinger فریم را نگه می دارد تا زمانی که نرخ فریم و vsync در فاز باشند.
شکل زیر تعامل بین GameManagerService و SurfaceFlinger را توضیح می دهد:
SurfaceFinger یک جفت نگاشت <UID, Frame Rate>
برای تعیین اولویت کاهش سرعت فریم جدید حفظ می کند. UID
بین کاربران و بازیها منحصربهفرد است، به طوری که هر کاربر در یک دستگاه میتواند تنظیمات متفاوتی از نرخ فریم روی همان بازی داشته باشد. برای کاهش نرخ فریم یک بازی، GameServiceManager SurfaceFlinger را فراخوانی می کند تا نرخ فریم یک UID را لغو کند. با این مکانیسم، SurfaceFlinger هر زمان که حالت بازی تغییر کند یا مداخله به روز شود، نقشه برداری را به روز می کند. SurfaceFlinger تغییرات FPS را با بستن بافرها بر این اساس کنترل می کند.
برای درک بیشتر در مورد FPS throttling، به مقدمه FPS throttling مراجعه کنید.