جلسات آهسته

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

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

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

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

نحوه اندازه‌گیری FPS و تشخیص فریم‌های کند

دستور dumpsys surfaceflinger timestats در اندروید، میانگین FPS و هیستوگرام زمان‌بندی Present to Present را برای تمام لایه‌هایی که رندر می‌شوند، ارائه می‌دهد. زمان حال تا حال یک فریم، فاصله بین فریم فعلی و فریم قبلی است که ترسیم می‌شود. در اینجا مراحل استفاده از این دستور برای جمع‌آوری FPS بازی شما آمده است:

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

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

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

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

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

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

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

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    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. پس از جمع‌آوری تمام اطلاعات، باید با استفاده از flag disable آمار زمانی را غیرفعال کنید:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

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

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

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

سواپی چیست؟

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

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

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

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

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

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

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

یونیتی قابلیت Android Frame Pacing را در موتور خود ادغام کرده است. برای فعال کردن این ویژگی در یونیتی ۲۰۱۹.۲ یا بالاتر، در قسمت Project Settings > Player > Settings for Android > Resolution and Presentation، گزینه Optimized Frame Pacing را تیک بزنید:

پنجره تنظیمات پروژه.
شکل ۲. فعال کردن تنظیم سرعت فریم در موتور یونیتی

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

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

Unreal نسخه ۴.۲۵ و بالاتر، کتابخانه Android Frame Pacing را که بخشی از کیت توسعه بازی اندروید است، ادغام می‌کند. مقاله Mobile Frame Pacing نحوه فعال‌سازی کتابخانه Android Frame Pacing و نحوه کنترل سرعت فریم از طریق کد C++ را توضیح می‌دهد.

ولکان چیست؟

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

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

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

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

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

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

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

پنجره تنظیمات پروژه.
شکل ۳. فعال کردن رابط برنامه‌نویسی گرافیکی خودکار Unity

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

پنجره تنظیمات پروژه.
شکل ۴. انتخاب دستی Vulkan به عنوان رابط برنامه‌نویسی گرافیکی اصلی در Unity

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

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

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

پنجره تنظیمات پروژه.
شکل 5. فعال کردن Vulkan در موتور Unreal

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

ADPF چیست؟

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

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

ویژگی‌های اصلی ADPF عبارتند از:

  • API حرارتی : وضعیت حرارتی دستگاه را رصد می‌کند تا برنامه بتواند قبل از اینکه حجم کار ناپایدار شود، آن را به صورت پیشگیرانه تنظیم کند.
  • API راهنمای عملکرد CPU : راهنمایی‌های عملکردی ارائه می‌دهد که به اندروید اجازه می‌دهد تنظیمات عملکرد مناسب (مثلاً نقطه کار CPU یا هسته) را برای حجم کار انتخاب کند.
  • API حالت بازی و API وضعیت بازی : بهینه‌سازی بازی را با اولویت‌بندی عملکرد یا ویژگی‌های عمر باتری، بر اساس تنظیمات کاربر و پیکربندی‌های خاص بازی، فعال کنید.
  • حالت عملکرد ثابت : حالت عملکرد ثابت را در طول بنچمارک‌گیری روی دستگاه فعال کنید تا اندازه‌گیری‌هایی را دریافت کنید که توسط کلاک پویای CPU تغییر نمی‌کنند.
  • حالت بهره‌وری انرژی : به جلسه می‌گوید که نخ‌های موجود در Performance Hint Session می‌توانند با خیال راحت طوری برنامه‌ریزی شوند که بهره‌وری انرژی را بر عملکرد ترجیح دهند. در اندروید ۱۵ (سطح API ۳۵) موجود است.

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

آزمایشگاه کد « ادغام ویژگی‌های سازگاری در بازی بومی شما» شما را راهنمایی می‌کند تا ویژگی‌های ADPF را با مراحلی که می‌توانید با سرعت خودتان دنبال کنید، در بازی خود ادغام کنید. در پایان آزمایشگاه کد، ویژگی‌های زیر را ادغام خواهید کرد:

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

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

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

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

پنجره تنظیمات پروژه.
شکل 6. ادغام ADPF در موتور یونیتی.

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

پنجره تنظیمات پروژه.
شکل 7. ادغام ADPF در موتور Unreal.
  1. افزونه را دانلود کنید
  2. افزونه را در پوشه افزونه پروژه کپی کنید
  3. افزونه ADPF Unreal Engine را در ویرایشگر Unreal فعال کنید
  4. ویرایشگر Unreal را دوباره راه اندازی کنید
  5. بازی را بسازید و بپزید

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