اخبار محصول

بهینه‌سازی عملکرد برای اندروید XR با Unity

مطالعه ۶ دقیقه‌ای
Luke Hopkins
مهندس روابط توسعه‌دهنده، اندروید

سامسونگ گلکسی XR از راه رسید ، مجهز به اندروید XR! این پست وبلاگ بخشی از هفته ویژه اندروید XR ما است که در آن منابعی - پست‌های وبلاگ، ویدیوها، نمونه کد و موارد دیگر - را ارائه می‌دهیم که همگی برای کمک به شما در یادگیری، ساخت و آماده‌سازی برنامه‌هایتان برای اندروید XR طراحی شده‌اند.

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

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

در این راهنما، شما را با بهینه‌سازی‌های ضروری عملکرد که برای توسعه اندروید XR نیاز دارید، آشنا خواهیم کرد. یاد خواهید گرفت که کدام ویژگی‌ها بیشترین افزایش عملکرد را ارائه می‌دهند، چه زمانی از آنها استفاده کنید و چگونه با هم کار می‌کنند تا به شما در رسیدن به اهداف نرخ فریم خود کمک کنند.

هدف ما این است:

  • حداقل: ۷۲ فریم در ثانیه (بخشی از دستورالعمل‌های کیفیت بازی ما)
  • اختیاری: ۹۰ فریم بر ثانیه با بودجه ۱۱ میلی‌ثانیه برای هر فریم

برای اطلاعات بیشتر در مورد اینکه چرا حفظ چنین نرخ فریم بالایی مهم است ، دستورالعمل‌های عملکرد ما را بررسی کنید.

ویژگی‌های عملکردی خاص XR

ما قصد داریم با پوشش دو ویژگی عملکردی مختص XR شروع کنیم: Foveated Rendering و Vulkan Subsampling.

رندرینگ فووئت شده

رندرینگ Foveated یک بهینه‌سازی است که دو حالت دارد. حالت اول، حالت استاتیک است که مرکز صفحه را با وضوح بالاتر رندر می‌کند و به تدریج وضوح را هرچه دورتر نگاه کنید، کاهش می‌دهد.

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

رندرینگ Foveated به طور قابل توجهی حجم کار پردازنده گرافیکی (GPU) را بدون کاهش کیفیت تصویر دریافتی برای کاربر کاهش می‌دهد. زیبایی رندرینگ Foveated این است که کاربران متوجه کاهش کیفیت در دید جانبی خود نمی‌شوند، اما پردازنده گرافیکی شما مطمئناً متوجه بهبود عملکرد خواهد شد.

تصور کنید که در حال ساخت یک تجربه موزه‌ای با مصنوعات سه‌بعدی پیچیده هستید. بدون رندرینگ foveated، برای حفظ سرعت ۹۰ فریم بر ثانیه و رندر کردن همه چیز در «میدان دید» به مشکل برمی‌خورید. با رندرینگ foveated، می‌توانید جزئیات با چندضلعی بالا را در جایی که کاربر نگاه می‌کند نگه دارید، اما محیط پس‌زمینه با کیفیت پایین‌تری رندر می‌شود. کاربران شما متوجه تفاوت نمی‌شوند، اما شما فضای کافی برای اضافه کردن جزئیات بیشتر به صحنه خود خواهید داشت.

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

Vulkan Subsampling بهترین دوست رندرینگ foveated است. در حالی که رندرینگ foveated تصمیم می‌گیرد که چه چیزی در سطوح کیفیت مختلف رندر شود، Vulkan Subsampling نحوه رندر کارآمد سطوح کیفیت مختلف را با استفاده از Fragment Density Mapها مدیریت می‌کند .

وقتی Vulkan Subsampling با رندرینگ foveated ترکیب شود، 0.5 میلی‌ثانیه عملکرد بیشتری به شما می‌دهد. همچنین به صاف کردن لبه‌های ناهموار در دید محیطی شما کمک می‌کند و باعث می‌شود تصویر کلی تمیزتر به نظر برسد.

برای مثال، در یک بازی شبیه‌ساز پرواز که کاربران روی ابزارها و کنترل‌ها تمرکز می‌کنند، ترکیب رندرینگ foveated با Vulkan Subsampling به این معنی است که کنترل‌های دقیق به وضوح رندر می‌شوند، اما ساختار کابین خلبان از منابع کمتری استفاده می‌کند. این 0.5 میلی‌ثانیه اضافی زیاد به نظر نمی‌رسد، اما تفاوت بین داشتن فضا برای یک عنصر تعاملی اضافی یا افت فریم در لحظات حساس است.

ویژگی‌های پردازنده گرافیکی برای صحنه‌های پیچیده

علاوه بر Foveated Rendering و Vulkan Subsampling، برخی ویژگی‌های GPU وجود دارند که از طریق نمونه‌سازی و حذف هوشمند، فشار غیرضروری را کاهش می‌دهند. این ویژگی‌ها به ویژه برای صحنه‌های پیچیده با هندسه تکراری یا انسداد قابل توجه مؤثر هستند.

کشوی مخصوص پردازنده گرافیکی (GPU Resident Drawer)

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

این ویژگی برای صحنه‌های بزرگ با مش‌های تکراری، مانند درختان در یک جنگل، مبلمان در یک ساختمان اداری یا وسایل پراکنده در سراسر یک محیط، بیشترین تأثیر را دارد.

یک صحنه جنگلی را تصور کنید که ۲۰۰ درخت با استفاده از یک شبکه پایه یکسان دارد. بدون GPU Resident Drawer، شما ۲۰۰ فراخوانی ترسیم خواهید داشت که GPU را اشغال می‌کند و در نتیجه CPU را آزاد می‌کند. وقتی این ویژگی را فعال می‌کنید، GPU به طور هوشمند آن درختان را نمونه‌سازی می‌کند که باید تعداد آنها را به ۵ تا ۱۰ فراخوانی ترسیم کاهش دهد. این یک صرفه‌جویی عظیم در GPU است که می‌توانید آن را در منطق گیم‌پلی یا محاسبات فیزیک سرمایه‌گذاری کنید.

حذف انسداد GPU

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

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

به عنوان مثال، فرض کنید در حال ساخت یک خانه چند اتاقه هستید. وقتی کاربر در اتاق نشیمن است، چرا چرخه‌های GPU را برای رندر آشپزخانه با جزئیات کامل که کاملاً پشت دیوار پنهان شده است، هدر دهید؟ GPU Occlusion Culling به طور خودکار از رندر آن اشیاء پنهان صرف نظر می‌کند و به شما بودجه عملکرد بیشتری برای آنچه واقعاً قابل مشاهده است، می‌دهد.

نظارت بر عملکرد شما

فقط استفاده از این ویژگی‌ها کافی نیست. شما همچنین باید بهینه‌سازی‌های خود را اندازه‌گیری کنید، تا بتوانید تأثیر آنها را کمّی کنید و تأیید کنید که تغییرات شما واقعاً مؤثر هستند.

API معیارهای عملکرد

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

قبل از ایجاد تغییرات، یک خط مبنا ایجاد کنید، بهینه‌سازی را اعمال کنید، تأثیر را اندازه‌گیری کنید و تکرار کنید. این رویکرد مبتنی بر داده به این معنی است که می‌دانید در واقع عملکرد را بهبود می‌بخشید، نه اینکه حدس بزنید.

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

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

اشکال‌زدای قاب

دیباگر فریم (Frame Debugger) ابزار داخلی یونیتی برای درک دقیق نحوه رندر شدن صحنه، فریم به فریم، است. این ابزار توالی فراخوانی‌های ترسیم (draw calls) را به شما نشان می‌دهد و به شما امکان می‌دهد تا با بررسی گام به گام آنها، از صحت عملکرد بهینه‌سازی‌های خود اطمینان حاصل کنید.

می‌خواهید مطمئن شوید که SRP Batcher کار می‌کند؟ به دنبال ورودی‌های 'RenderLoopNewBatcher' در Frame Debugger باشید. بررسی می‌کنید که آیا GPU Resident Drawer به درستی بچینگ می‌کند؟ به دنبال ورودی‌های 'Hybrid Batch Group' باشید. این تأییدهای بصری به شما کمک می‌کنند تا بفهمید که آیا تنظیمات بهینه‌سازی شما واقعاً اعمال می‌شوند یا خیر.

۵۰ فراخوانی اول ترسیم صحنه خود را بررسی کنید. اگر می‌بینید که اشیاء مشابه به جای دسته‌ای، به صورت جداگانه ترسیم می‌شوند، این به شما می‌گوید که نمونه‌سازی یا دسته‌ای‌سازی شما به درستی کار نمی‌کند. اشکال‌زدای فریم این مشکلات را فوراً قابل مشاهده می‌کند تا بتوانید آنها را برطرف کنید.

بهینه‌سازی‌های اضافی

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

  • تنظیمات URP: HDR و پردازش پس از اجرا را برای XR موبایل غیرفعال کنید. این ویژگی‌ها در مقایسه با هزینه عملکردشان بر روی سخت‌افزار موبایل، حداقل تأثیر بصری را ارائه می‌دهند، بنابراین با تفاوت‌های بصری به سختی قابل درک، افزایش عملکرد قابل اندازه‌گیری را دریافت خواهید کرد.
  • SRP Batcher: سربار CPU را برای صحنه‌هایی با متریال‌های زیاد که از یک نوع shader استفاده می‌کنند، کاهش می‌دهد. با به حداقل رساندن تغییرات حالت رندر بین فراخوانی‌های ترسیم، می‌توانید زمان CPU صرف شده برای رندر را به میزان قابل توجهی کاهش دهید.
  • نرخ تازه‌سازی تصویر: به صورت پویا و بر اساس پیچیدگی صحنه، نرخ تازه‌سازی تصویر را بین ۷۲ فریم بر ثانیه و ۹۰ فریم بر ثانیه تنظیم کنید. برای حفظ پایداری، نرخ فریم را در سکانس‌های پیچیده کاهش دهید و سپس برای تعامل فوق‌العاده روان، آن را در لحظات ساده‌تر افزایش دهید.
  • بافت‌های عمق/مات: این موارد را غیرفعال کنید، مگر اینکه به‌طور خاص برای جلوه‌های سایه‌زن مورد نیاز باشند. آن‌ها باعث عملیات کپی غیرضروری GPU می‌شوند که عملکرد را بدون ارائه مزیتی برای اکثر برنامه‌ها هدر می‌دهد.
  • مقیاس رندر URP: این تنظیم به شما امکان می‌دهد برای بهبود عملکرد، با وضوح پایین‌تر رندر کنید یا برای بهبود کیفیت بصری، وضوح رندر را افزایش دهید.

برای دستورالعمل‌های گام به گام در مورد این موارد و بهینه‌سازی‌های بیشتر، راهنمای کامل عملکرد Unity برای Android XR ما را بررسی کنید.

نتیجه‌گیری

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

نقشه راه شما اینجاست:

  1. با Foveated Rendering و Vulkan Subsampling شروع کنید. این ویژگی‌های مختص XR، صرفه‌جویی فوری و قابل توجهی در مصرف پردازنده گرافیکی ارائه می‌دهند.
  2. اگر صحنه‌های پیچیده‌ای با هندسه یا فضاهای داخلی تکراری دارید، GPU Resident Drawer و Occlusion Culling را اضافه کنید.
  3. همه چیز را با API معیارهای عملکرد رصد کنید تا مطمئن شوید تغییرات شما واقعاً مفید هستند
  4. بهینه‌سازی‌های اضافی URP را برای افزایش سقف عملکرد بررسی کنید

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

قدم بعدی: گسترش مهارت‌هایتان

آماده‌اید تا عمیق‌تر بررسی کنیم؟ این منابع را بررسی کنید:

  • راهنمای عملکرد یونیتی برای اندروید XR - دستورالعمل‌های کامل پیاده‌سازی گام به گام برای تمام ویژگی‌های پوشش داده شده در اینجا .
  • شروع کار با یونیتی و اندروید XR - محیط توسعه خود را تنظیم کنید و شروع به ساخت کنید .
  • مستندات توسعه‌دهندگان اندروید XR - راهنماهای جامع برای همه ویژگی‌های اندروید XR
    نوشته شده توسط:

    ادامه مطلب