اخبار محصول

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

‫۶ دقیقه خواندن
مشاهده نمایه لوک هاپکینز
Luke Hopkins مهندس روابط توسعه‌دهندگان، Android

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

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

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

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

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

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

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

ویژگی‌های عملکردی مختص واقعیت گسترده

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

پرداز زدن کانونی

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

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

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

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

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

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

وقتی «زیرنمونه‌گیری Vulkan» با «پرداخت گودی‌محور» ترکیب شود، عملکرد را ۰٫۵ میلی‌ثانیه بیشتر بهبود می‌بخشد. همچنین به صاف کردن لبه‌های ناهموار در دید جانبی شما کمک می‌کند و باعث می‌شود تصویر کلی تمیزتر به‌نظر برسد.

برای مثال، در بازی شبیه‌ساز پرواز که کاربران روی ابزارها و کنترل‌ها تمرکز می‌کنند، ترکیب پرداز کانونی با «زیرنمونه‌گیری Vulkan» به این معنی است که کنترل‌های دقیق به‌صورت واضح پرداز می‌شوند، اما ساختار جانبی کابین خلبان از منابع کمتری استفاده می‌کند. این ۰٫۵ میلی‌ثانیه اضافی شاید زیاد به‌نظر نرسد، اما تفاوت بین داشتن فضا برای یک عنصر تعاملی اضافی یا افت فریم در لحظات حساس است.

ویژگی‌های GPU برای صحنه‌های پیچیده

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

GPU Resident Drawer

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

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

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

حذف انسداد واحد پردازش گرافیکی

حذف انسداد GPU به‌جای CPU از GPU برای شناسایی و رد کردن پردازش اشیای پنهان استفاده می‌کند. این ویژگی به‌طور خودکار آنچه را که پشت اشیای دیگر مسدود (پنهان) شده است شناسایی می‌کند، بنابراین واحد پردازش گرافیکی شما برای چیزهایی که کاربر نمی‌تواند ببیند هدر نمی‌رود.

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

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

پایش عملکرد شما

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

Performance Metrics API

Performance Metrics API نظارت هم‌زمان بر مصرف حافظه، عملکرد واحد پردازش مرکزی، و عملکرد واحد پردازش گرافیکی برنامه‌هایتان را ارائه می‌دهد. این ابزار داده‌های جامعی از لایه‌های ترکیب‌کننده و زمان اجرا ارائه می‌دهد تا بتوانید دقیقاً ببینید چه اتفاقی در برنامه‌تان می‌افتد.

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

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

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

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

Frame Debugger ابزار داخلی Unity برای درک دقیق نحوه رندر شدن صحنه شما، فریم به فریم، است. این ابزار توالی فراخوانی‌های ترسیم را به شما نشان می‌دهد و به شما امکان می‌دهد تا با گام‌به‌گام پیش رفتن در آن‌ها، درستی‌سنجی کنید که بهینه‌سازی‌هایتان به‌درستی کار می‌کنند.

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

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

بهینه‌سازی‌های بیشتر

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

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

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

نتیجه‌گیری

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

این هم نقشه راه شما:

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

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

مرحله بعدی: گسترش مهارت‌ها

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

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