Version: 2022.3
XR SDK 网格子系统
XR SDK Stats 接口

XR SDK PreInit 接口

此接口用于在创建图形设备之前对其进行配置。常见用例包括在多 GPU 场景中选择特定 GPU、启用图形扩展和修改缓冲区创建。

概述

您的提供程序可以导出原生符号 XRSDKPreInit,它在运行时初始化的早期,在图形设备创建之前被调用。它应将相关的入口点填入 UnityXRPreInitProvider 结构,以便为引擎提供在早期初始化期间可能需要的信息。某些提供程序需要这些信息,因为图形设备的创建早于提供程序初始化。

发现

Unity 项目构建过程需要您的提供程序库的名称才能在引擎启动时调用 XRSDKPreInit()。为此,需要在您的 XRLoader 上实现 IXRLoaderPreInit.GetPreInitLibraryName 接口:

public string GetPreInitLibraryName(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup)
{
    return "XRSDKMyProviderLibraryName";
}

当 Unity 启动时,它会运行上面的代码来加载库。然后,Unity 打开该库,查找 XRSDKPreInit 导出并调用它。此时,XRSDKPreInit 应该注册一个 UnityXRPreInitProvider

在 XRSDKPreInit 中注册

这是一个简单的示例,它注册了您可以用于早期引擎初始化的所有回调:

XRSDKPreInit(IUnityInterfaces * interfaces)
{
    IUnityXRPreInit* preInit = (IUnityXRPreInit*)interfaces->GetInterface(GetUnityInterfaceGUID<IUnityXRPreInit>());

    UnityXRPreInitProvider provider = { 0 };

    provider.userData = nullptr;
    provider.GetPreInitFlags = GetPreInitFlags;
    provider.GetGraphicsAdapterId = GetGraphicsAdapterId;
    provider.GetVulkanInstanceExtensions = GetVulkanInstanceExtensions;
    provider.GetVulkanDeviceExtensions = GetVulkanDeviceExtensions;

    preInit->RegisterPreInitProvider(&provider);
}

将不需要的任何回调设置为 nullptr


回调

GetPreInitFlags

GetPreInitFlags 返回一个 64 位的标志位域。目前公开了以下标志:

  • kUnityXRPreInitFlagsEGLUsePBuffer - On EGL platforms (Android, standalone Meta/Oculus devices, etc.), EGL should be initialized using PBuffers.
  • kUnityXRPreInitFlagsEGLUseNoErrorContext - 在 EGL 平台上,EGL 应该用 NO_ERROR 上下文。

提供程序不应设置任何未定义的位,因为它们可能用于未来的扩展。

GetGraphicsAdapterId

GetGraphicsAdapterId 设置图形适配器,以供 Unity 运行时图形设备用于图形 API 初始化。例如,如果用户将头盔插入不同于用户主显示设备的 GPU,Unity 可能需要明确针对次要 GPU 初始化图形 API。

GetVulkanDeviceExtensions 和 GetVulkanInstanceExtensions

如果提供程序需要 Unity 来初始化具有设备和实例特定扩展的 Vulkan,则使用 GetVulkanDeviceExtensionsGetVulkanInstanceExtensions。这通常用于合成器表面共享。二者都返回一个以空格分隔的扩展字符串。


已知问题

  • 目前,GetPreInitLibraryName 仅在 XRManager 预制件中的第一个 XRLoader 上调用,因此只有列表中的第一个提供程序可以在运行时提供 PreInit 入口点。
  • PreInit 需要一个本机库,以在早期引擎初始化期间公开入口点。
  • PreInit 目前不适用于编辑器。
XR SDK 网格子系统
XR SDK Stats 接口