Android XR एक्सटेंशन की सेटिंग का इस्तेमाल करके, फ़्रेम रेट को बेहतर बनाएं, जीपीयू लोड को कम करें, और रेंडरिंग में लगने वाले समय को कम करें

एक्सआर की सुविधा वाले डिवाइस
इस गाइड की मदद से, इन तरह के एक्सआर डिवाइसों के लिए अनुभव बनाए जा सकते हैं.
एक्सआर हेडसेट
वायर्ड एक्सआर ग्लास

Unity, परफ़ॉर्मेंस से जुड़ी कुछ ऐसी सुविधाएं उपलब्ध कराता है जो सिर्फ़ Android XR के लिए हैं. इनके लिए, Android XR Extensions पैकेज की ज़रूरत होती है. इन सुविधाओं को चालू करें. इससे स्पेसवार और Vulkan सबसैंपलिंग की मदद से, फ़्रेम रेट को बेहतर बनाया जा सकता है और GPU लोड को कम किया जा सकता है. साथ ही, लेट लैचिंग का इस्तेमाल करके, ट्रैक की गई रेंडरिंग में लगने वाले समय को कम किया जा सकता है.

ज़रूरी शर्तें

इस गाइड में दिए गए निर्देशों का पालन करने से पहले, पक्का करें कि आपने इन ज़रूरी शर्तों को पूरा कर लिया हो:

स्पेस वॉर्प की सुविधा चालू करना

URP Application Spacewarp, OpenXR ऑप्टिमाइज़ेशन है. यह हर दूसरे फ़्रेम को सिंथेसाइज़ करके, ज़्यादा फ़्रेम रेट बनाए रखने में मदद करता है. इस तकनीक में, पिछले फ़्रेम के मोशन वेक्टर और डेप्थ डेटा का इस्तेमाल किया जाता है. इससे यह अनुमान लगाया जाता है कि पिक्सल को कहां ले जाना चाहिए. इससे कंप्यूटेशनल पावर और ऊर्जा का इस्तेमाल कम होता है.

फ़ायदे

  • यह फ़्रेम को रेंडर करने के लिए, जीपीयू के वर्कलोड को कम करता है. इसके लिए, यह फ़्रेम के बीच के फ़्रेम बनाता है.
  • इससे कंप्यूटेशनल पावर और ऊर्जा की खपत काफ़ी कम हो जाती है.
  • यह कुकी, रीप्रोजेक्शन का इस्तेमाल करती है. इससे उपयोगकर्ता की गतिविधियों और डिसप्ले अपडेट के बीच की लेटेन्सी कम हो जाती है.

इस सुविधा को चालू करें

  1. Unity के मुख्य मेन्यू में जाकर, Edit > Project Settings पर क्लिक करें.
  2. XR प्लग-इन मैनेजमेंट सेक्शन को बड़ा करें.
  3. अपने मौजूदा XR डिवाइस से जुड़ा टैब चुनें.
  4. OpenXR की सुविधा वाले ग्रुप सेक्शन पर जाएं.
  5. सभी सुविधाएं सेक्शन में जाकर, ऐप्लिकेशन SpaceWarp को चालू करें.

    स्पेसवार के लिए Unity की सेटिंग

Vulkan की सबसैंपलिंग की सुविधा चालू करें

Vulkan Subsampling की मदद से, फ़्रैगमेंट डेंसिटी मैप का इस्तेमाल करके, अलग-अलग डेंसिटी पर इमेज बनाई और सैंपल की जा सकती हैं. Vulkan की इस सुविधा की मदद से, स्क्रीन के अलग-अलग हिस्सों को अलग-अलग रिज़ॉल्यूशन पर रेंडर किया जा सकता है. साथ ही, उन्हें मेमोरी में ट्रांसफ़र किया जा सकता है. यह सुविधा, फ़ोविएटेड रेंडरिंग के लिए खास तौर पर काम की है. इसमें, आस-पास के हिस्सों के लिए कम रिज़ॉल्यूशन का इस्तेमाल किया जा सकता है.

फ़ायदे

  • फ़ोविएटेड रेंडरिंग के साथ इस्तेमाल करने पर, डिवाइस के फ़ॉर्म फ़ैक्टर के हिसाब से परफ़ॉर्मेंस में अलग-अलग सुधार होता है.
  • यह बाइलिनियर फ़िल्टरिंग की मदद से, इमेज के किनारों पर मौजूद पिक्सल के रंग में अंतर को कम करता है.
  • यह कुकी, स्क्रीन के अलग-अलग हिस्सों में वैरिएबल रेट रेंडरिंग को बेहतर तरीके से काम करने में मदद करती है.

इस सुविधा को चालू करें

  1. Unity के मुख्य मेन्यू में जाकर, Edit > Project Settings पर क्लिक करें.
  2. XR प्लग-इन मैनेजमेंट सेक्शन को बड़ा करें. इसके बाद, OpenXR पर क्लिक करें.
  3. Android XR (एक्सटेंशन): सेशन मैनेजमेंट के बगल में मौजूद, सेटिंग आइकॉन पर क्लिक करें.
  4. सबसैंपलिंग (Vulkan) को चालू करें.

    Vulkan सबसैंपलिंग के लिए Unity की सेटिंग

लेट लैचिंग की सुविधा चालू करना

लेट लैचिंग एक ऐसी तकनीक है जो उपयोगकर्ता की शारीरिक गतिविधि और डिसप्ले पर दिखने वाले बदलाव के बीच के समय को कम करती है. इससे हेड पोज़ को फ़्रेम जनरेशन पाइपलाइन में बाद में अपडेट किया जा सकता है. इससे आपके एक्सआर ऐप्लिकेशन के फ़्रेम रेट को बेहतर बनाने के साथ-साथ, उन्हें ज़्यादा आसानी से इस्तेमाल किया जा सकता है. यह सुविधा, इनपुट लेटेन्सी को कम करके ऐसा करती है. इनपुट लेटेन्सी को पूरे फ़्रेम टाइम के हिसाब से कम किया जाता है.

फ़ायदे

  • इससे मोशन-टू-फ़ोटॉन (एमटीपी) की लेटेन्सी काफ़ी कम हो जाती है.
  • इससे उपयोगकर्ताओं को आराम मिलता है और मोशन सिकनेस कम होती है.
  • इससे स्थिरता और सटीक जानकारी मिलती है.

इस सुविधा को चालू करें

लेट लैचिंग की सुविधा चालू करने के लिए, अपने ऐप्लिकेशन के लिए रनटाइम में इस सुविधा को चालू करें:

private XRDisplaySubsystem xrDisplay;

private XRDisplaySubsystem.LateLatchNode lateLatchNode = XRDisplaySubsystem.LateLatchNode.Head;

void Start()
{
    List<XRDisplaySubsystem> xrDisplaySubsystems = new();

    SubsystemManager.GetSubsystems(xrDisplaySubsystems);

    if (xrDisplaySubsystems.Count >= 1)
    {
        xrDisplay = xrDisplaySubsystems[0];
    }
}

void Update()
{
    if (xrDisplay != null)
    {
        transform.position += new Vector3(Mathf.Epsilon, 0, 0);

        Quaternion rot = transform.rotation;

        rot.x += Mathf.Epsilon;

        transform.rotation = rot;

        xrDisplay.MarkTransformLateLatched(transform, lateLatchNode);
    }
}