版本:Unity 6 (6000.0)
语言:English
XR SDK 网格子系统
XR SDK 统计信息接口

XR SDK 预初始化接口

此接口允许您在创建图形设备之前对其进行配置。常见用例包括在多 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 - 在 EGL 平台(Android、独立 Meta/Oculus 设备等)上,EGL 应使用 PBuffer 初始化。
  • kUnityXRPreInitFlagsEGLUseNoErrorContext - 在 EGL 平台上,EGL 应使用 NO_ERROR 上下文初始化。

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

GetGraphicsAdapterId

GetGraphicsAdapterId设置 Unity 运行时图形设备用于图形 API 初始化的图形适配器。例如,如果用户将耳机插入与用户主显示设备不同的 GPU,则 Unity 可能需要初始化显式针对辅助 GPU 的图形 API。

GetVulkanDeviceExtensions 和 GetVulkanInstanceExtensions

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


已知问题

  • 目前,GetPreInitLibraryName仅在 XRManager 预制件一种资产类型,允许您存储一个完整的 GameObject,包括组件和属性。预制件充当模板,您可以从中在场景中创建新的对象实例。 更多信息
    参见 术语表
    中的第一个 XRLoader 上调用,因此列表中的第一个提供程序只能在运行时提供预初始化入口点。
  • PreInit 需要一个原生库在早期引擎初始化期间公开入口点。
  • PreInit 目前不适用于编辑器。
XR SDK 网格子系统
XR SDK 统计信息接口