اخبار محصول

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

برای مثال، در بازی شبیه‌ساز پرواز که کاربران روی ابزارها و کنترل‌ها تمرکز می‌کنند، ترکیب پرداز کانونی با «زیرنمونه‌گیری 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 امکان نظارت هم‌زمان بر مصرف حافظه، عملکرد واحد پردازش مرکزی، و عملکرد واحد پردازش گرافیکی برنامه‌هایتان را فراهم می‌کند. این ابزار داده‌های جامعی از لایه‌های ترکیب‌کننده و زمان اجرا ارائه می‌دهد تا بتوانید دقیقاً ببینید در برنامه‌تان چه اتفاقی می‌افتد.

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

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

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

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

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

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

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

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

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

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

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

نتیجه‌گیری

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

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

  1. با «پرداخت Foveated» و «زیرنمونه‌گیری 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
نویسنده:
ادامه خواندن