جلسه‌های آهسته

در «معیارهای کلیدی Android»، جلسه آهسته جلسه‌ای است که در آن بیش‌از ۲۵٪ قاب‌ها آهسته باشد. اگر قابی کمتر از ۵۰ میلی‌ثانیه پس‌از قاب قبلی ارائه نشود، آن قاب آهسته است (معادل ۲۰ قاب در ثانیه). «معیارهای کلیدی Android» سنجه دوم «جلسه‌های آهسته» را نیز با هدف ۳۴ میلی‌ثانیه (معادل ۳۰ فریم در ثانیه) گزارش می‌کند. بااستفاده از «جلسه‌های آهسته»، می‌توانید عملکرد نرخ فریم بازی‌تان را درک کنید که بر میزان روان و سیال بودن بازی شما برای کاربران تأثیر می‌گذارد.

در زمان مناسب، Play کاربران را از بازی‌هایی که نمی‌توانند به نرخ ۲۰ فریم در ثانیه در تلفنشان برسند دور خواهد کرد. توجه داشته باشید که «معیارهای کلیدی Android» تنها پس‌از اینکه بازی شما یک دقیقه اجرا شد، نظارت بر نرخ فریم را شروع می‌کند.

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

گرافیک‌های شبیه نمودار دایره‌ای که تعداد فریم‌های کند و فریم‌های غیرکند را نشان می‌دهد.
شکل ۱. جلسه آهسته در «معیارهای کلیدی Android».

نحوه اندازه‌گیری FPS و تشخیص قاب‌های آهسته

فرمان Android dumpsys SurfaceFlinger --timestats میانگین FPS و هیستوگرام‌های زمان‌بندی ارائه به ارائه را برای همه لایه‌هایی که درحال پرداخت شدن هستند ارائه می‌دهد. زمان ارائه به ارائه یک قاب، فاصله زمانی بین کشیده شدن قاب فعلی و قاب قبلی است. برای استفاده از فرمان جمع‌آوری FPS بازی، این مراحل را دنبال کنید:

  1. فرمان را با پرچم‌های enable و clear اجرا کنید تا ضبط اطلاعات شروع شود:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. وقتی بازی به‌اندازه کافی اجرا شد، فرمان را دوباره با پرچم dump اجرا کنید تا اطلاعات را تخلیه کنید:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    اطلاعات تخلیه‌شده فریم‌های کل و هیستوگرام presentToPresent را برای همه لایه‌های رندرشده توسط SurfaceFlinger ارائه می‌دهد. باید بخش بازی‌تان را با فیلتر کردن براساس layerName پیدا کنید:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

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

    برای مثال، درصد قاب آهسته ۲۰ FPS = (مجموع مقادیر از ۵۴ میلی‌ثانیه تا ۱۰۰۰ میلی‌ثانیه) / totalFrames x ‏۱۰۰

    totalFrames = 274
    ...
    presentToPresent histogram:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    میانگین FPS هر لایه نیز در تخلیه نشان داده می‌شود:

    ...
    averageFPS = 30.179
    ...
    
  3. پس‌از جمع‌آوری همه اطلاعات، timestats را بااستفاده از پرچم disable غیرفعال کنید:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

دلایل و راه‌حل‌های فریم کند

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

برای رفع این مشکلات و بهبود عملکرد بازی‌تان، از Android Frame Pacing (Swappy)، Vulkan، و ADPF استفاده کنید.

Swappy چیست؟

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

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

  • قاب‌های گذشته را به‌طور داخلی میان‌گیری می‌کند.
  • ارسال‌های دیرهنگام قاب را شناسایی می‌کند.
  • وقتی قاب‌های دیرهنگام شناسایی می‌شود، نمایش قاب‌های گذشته را تکرار می‌کند.

ببینید Mir 2 چگونه از Swappy برای کاهش نرخ جلسه آهسته خود از ۴۰٪ به ۱۰٪ استفاده کرد.

نحوه استفاده از Swappy در پروژه‌های بومی

برای ادغام کتابخانه Android Frame Pacing در بازی‌تان، راهنماهای زیر را ببینید:

نحوه استفاده از Swappy در موتور بازی Unity

Unity ابزار Android Frame Pacing را در موتور خود ادغام کرده است. برای فعال کردن این ویژگی در Unity نسخه ۲۰۱۹.۲ یا بالاتر، چارگوش «سرعت فریم بهینه‌شده» را در تنظیمات پروژه > پخش‌کننده > تنظیمات برای Android > وضوح و ارائه علامت بزنید:

پنجره «تنظیمات پروژه Unity» که چارگوش انتخاب «سرعت فریم بهینه‌شده» را نشان می‌دهد.
شکل ۲. «سرعت فریم» را در Unity Engine فعال کنید.

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

نحوه استفاده از Swappy در موتور بازی Unreal

Unreal نسخه ۴.۲۵ و بالاتر Android Frame Pacing Library را ادغام می‌کند که بخشی از Android Game Development Kit است. مقاله سرعت فریم تلفن همراه نحوه فعال کردن «کتابخانه سرعت فریم Android» و نحوه کنترل سرعت فریم از کد C++‎ را توضیح می‌دهد.

Vulkan چیست

Vulkan یک میانای برنامه‌سازی کاربردی گرافیک سه‌بعدی چندسکویی مدرن است که برای به‌حداقل رساندن انتزاع بین سخت‌افزار گرافیک دستگاه و بازی شما طراحی شده است. Vulkan میانای برنامه‌سازی کاربردی گرافیک سطح پایین اصلی در Android است که جایگزین OpenGL ES شده است. OpenGL ES هنوز در Android پشتیبانی می‌شود، اما دیگر درحال توسعه ویژگی فعال نیست.

Vulkan مزایای زیر را نسبت‌به OpenGL ES ارائه می‌دهد:

  • معماری کارآمدتر با سربار CPU کمتر در درایور گرافیک
  • استراتژی‌های بهینه‌سازی جدید برای بهبود عملکرد واحد پردازش مرکزی
  • ویژگی‌های گرافیکی جدیدی که در OpenGL ES دردسترس نیستند، مثل میاناهای برنامه‌سازی کاربردی بدون اتصال و ردیابی پرتوها

نحوه استفاده از Vulkan در پروژه‌های Android بومی

‫codelab شروع به کار با Vulkan در Android شما را در راه‌اندازی خط لوله پردازش Vulkan و سپس پردازش مثلث بافت‌دار و چرخان روی صفحه‌نمایش راهنمایی می‌کند. از codelab برای یادگیری نحوه پرداخت گرافیک بازی استفاده کنید.

نحوه استفاده از Vulkan در موتور بازی Unity

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

پنجره Unity Project Settings با Auto Graphics API فعال‌شده.
شکل ۳. Unity Auto Graphics API را فعال کنید.

همچنین می‌توانید Vulkan را به‌صورت دستی با غیرفعال کردن Auto Graphics API فعال کنید، و Vulkan را در بالاترین اولویت در فهرست Graphics APIs قرار دهید. اگر از Unity نسخه ۲۰۲۱.۱ یا نسخه‌های قبلی استفاده می‌کنید، این تنها راه استفاده از Vulkan است.

پنجره Unity Project Settings (تنظیمات پروژه Unity) با Vulkan که در فهرست Graphics APIs (میاناهای برنامه‌سازی کاربردی گرافیک) اولویت‌بندی شده است.
شکل ۴. Vulkan را به‌صورت دستی به‌عنوان میانای برنامه‌سازی کاربردی گرافیک اصلی در Unity انتخاب کنید.

از افزونه موتور VkQuality Unity برای ارائه توصیه‌های زمان راه‌اندازی رابط برنامه‌سازی کاربردی گرافیک برای بازی‌تان جهت استفاده در دستگاه‌های خاص استفاده کنید.

نحوه استفاده از Vulkan در موتور بازی Unreal

برای فعال کردن Vulkan graphics API، به Project Settings (تنظیمات پروژه) > Platforms (پلاتفرم‌ها) > Android > Build (ساخت) بروید و Support Vulkan (پشتیبانی از Vulkan) را انتخاب کنید. وقتی هم پشتیبانی از Vulkan و هم پشتیبانی از OpenGL ES3.2 را انتخاب می‌کنید، Unreal به‌طور پیش‌فرض از Vulkan استفاده می‌کند. اگر دستگاه از Vulkan پشتیبانی نکند، Unreal به OpenGL ES 3.2 برمی‌گردد.

پنجره «تنظیمات پروژه Unreal Engine» که گزینه «پشتیبانی از Vulkan» را نشان می‌دهد.
شکل ۵. Vulkan را در Unreal Engine فعال کنید.

اگر از ویژگی‌های خاص Vulkan استفاده می‌کنید که عملکرد بدی در برخی دستگاه‌ها دارند، می‌توانید فایل BaseDeviceProfile.ini خود را سفارشی‌سازی کنید تا آن دستگاه‌ها را مستثنی کنید. برای آشنایی با نحوه سفارشی‌سازی BaseDeviceProfile.ini، سفارشی‌سازی نمایه‌های دستگاه و مقیاس‌پذیری برای Android را ببینید. چون درایورهای جدید دستگاه ممکن است دستگاه‌های بد شناخته‌شده قبلی را اصلاح کنند، فایل BaseDeviceProfile.ini خود را به‌روز نگه دارید تا همه بهینه‌سازی‌ها را دریافت کنید.

چارچوب عملکرد پویای Android چیست

چارچوب عملکرد پویای Android‏ (ADPF) بازی‌ها را براساس ویژگی‌های مدیریت پویای حرارتی، واحد پردازش مرکزی، و واحد پردازش گرافیکی در Android بهینه‌سازی می‌کند. تمرکز روی بازی‌ها است، اما می‌توانید از این ویژگی‌ها برای برنامه‌های دیگر با عملکرد فشرده نیز استفاده کنید.

ADPF مجموعه‌ای از میاناهای برنامه‌سازی کاربردی است که به بازی‌ها و برنامه‌هایی که عملکرد فشرده دارند اجازه می‌دهد به‌طور مستقیم‌تر با سیستم‌های حرارتی و برقی دستگاه‌های Android تعامل داشته باشند. با این میاناهای برنامه‌سازی کاربردی، می‌توانید رفتار پویا را در سیستم‌های Android پایش کنید و عملکرد بازی را در سطح پایداری که باعث گرم شدن بیش‌ازحد دستگاه‌ها نشود بهینه‌سازی کنید.

ویژگی‌های اصلی ADPF در اینجا آمده است:

  • Thermal API: وضعیت حرارتی دستگاه را پایش کنید تا برنامه بتواند قبل‌از اینکه حجم کاری ناپایدار شود، آن را به‌طور پیش‌گیرانه تنظیم کند.
  • CPU Performance Hint API: نکته‌های عملکردی ارائه می‌دهد که به Android اجازه می‌دهد تنظیمات عملکرد مناسب (برای مثال، نقطه یا هسته عملکرد واحد پردازش مرکزی) را برای حجم کاری انتخاب کند.
  • Game Mode API و Game State API: با اولویت‌بندی ویژگی‌های عملکرد یا عمر باتری، براساس تنظیمات کاربر و پیکربندی‌های خاص بازی، بهینه‌سازی بازی را فعال می‌کند.
  • حالت عملکرد ثابت: حالت عملکرد ثابت را درطول محک‌زنی در دستگاه فعال کنید تا اندازه‌گیری‌هایی را دریافت کنید که با زمان‌بندی پویای واحد پردازش مرکزی تغییر نمی‌کنند.
  • حالت بهره‌وری انرژی: به جلسه نشان می‌دهد که رشته‌ها در «جلسه راهنمایی عملکرد» را می‌توان به‌طور ایمن زمان‌بندی کرد تا بهره‌وری انرژی را بر عملکرد ترجیح دهند. در Android 15 (سطح میانای برنامه‌سازی کاربردی ۳۵) دردسترس است.

نحوه استفاده از ADPF در پروژه‌های Android بومی

‫codelab‏ Integrating Adaptability Features Into Your Native Game شما را راهنمایی می‌کند تا ویژگی‌های ADPF را با مراحلی که می‌توانید با سرعت خودتان دنبال کنید، در بازی‌تان ادغام کنید. در پایان codelab، ویژگی‌های زیر را ادغام خواهید کرد:

  • Thermal API: به شرایط حرارتی دستگاه گوش دهید و قبل‌از اینکه دستگاه وارد حالت کاهش سرعت حرارتی شود، واکنش نشان دهید.
  • Game Mode API: اولویت‌های بهینه‌سازی بازیکن را درک کنید (به‌حداکثر رساندن عملکرد یا حفظ باتری) و براساس آن تنظیم کنید.
  • میانای برنامه‌سازی کاربردی Game State: به سیستم اجازه می‌دهد از وضعیت بازی شما مطلع شود (درحال بار کردن، درحال بازی، واسط کاربر، و غیره) و سیستم می‌تواند منابع را براساس آن تنظیم کند (تقویت ورودی/خروجی، یا واحد پردازش مرکزی، واحد پردازش گرافیکی، و غیره).
  • Performance Hint API: مدل رشته‌بندی و حجم کاری‌تان را به سیستم اطلاع دهید تا سیستم بتواند منابع را براساس آن اختصاص دهد.

نحوه استفاده از ADPF در موتور بازی Unity

Adaptive Performance از Unity ابزاری برای توسعه‌دهندگان بازی است که به‌دنبال بهینه‌سازی بازی‌هایشان در دستگاه‌های همراه، به‌ویژه برای بوم‌سازگان متنوع Android، هستند. «عملکرد تطبیقی» به بازی شما امکان می‌دهد تا با عملکرد و ویژگی‌های حرارتی دستگاه به‌طور هم‌زمان سازگار شود و تجربه بازی روان و کارآمدی را تضمین کند.

ارائه‌دهنده Android عملکرد تطبیقی شما را در مراحل پیاده‌سازی ADPF در Unity راهنمایی می‌کند. همچنین ببینید عملکرد تطبیقی ADPF Unity و ارائه‌دهنده Android.

پنجره «تنظیمات پروژه Unity» که تنظیمات ارائه‌دهنده Adaptive Performance Android را نشان می‌دهد.
شکل ۶. ادغام ADPF در Unity Engine.

نحوه استفاده از ADPF در موتور بازی Unreal

پنجره «افزایه‌های Unreal Engine» که افزایه «چارچوب عملکرد پویای Android» را نشان می‌دهد.
شکل ۷. ادغام کردن ADPF در Unreal Engine.
  1. افزایه را بارگیری کنید.
  2. افزونه را در پوشه افزونه پروژه کپی کنید.
  3. افزایه ADPF Unreal Engine را در ویرایشگر Unreal فعال کنید.
  4. ویرایشگر Unreal را دوباره راه‌اندازی کنید.
  5. بازی را بسازید و آماده کنید.

افزایه چارچوب عملکرد پویای Android (ADPF) برای Unreal Engine عملکرد پایداری ارائه می‌دهد و از دریچه حرارتی جلوگیری می‌کند. افزونه را از GitHub بارگیری کنید. این افزونه ویژگی‌ها را با تنظیم مقادیر کنسول Unreal تغییر می‌دهد. برای جزئیات بیشتر، افزایه Unreal Engine چارچوب عملکرد پویای Android را ببینید.