跳到主要内容虚幻引擎 Pico 大空间 VR 开发:坐标原点与项目优化指南 | 极客日志C++大前端算法
虚幻引擎 Pico 大空间 VR 开发:坐标原点与项目优化指南
综述由AI生成对虚幻引擎 5 结合 Pico 一体机进行大空间 VR 开发中的坐标原点设置、性能优化及打包问题进行梳理。重点介绍了 SetTrackingOrigin 不同模式对场景初始化的影响,以及 VRAF 框架的适配修改。在优化方面,涵盖移动端光照、贴图流送、阴影闪烁修复及串流显存管理策略。同时记录了网络同步方案选择与常见打包报错(如内存不足、CPU 调度)的解决方案,旨在提升大空间项目的运行稳定性与画质表现。
猫巷少女19 浏览 大空间头显坐标设置
Pico 一体机开启大空间定位识别,并框选障碍物范围,暂时不用 Marker 贴图精细定位。
大空间一体机范围设置文档:https://business.picoxr.com/cn/doc/Enterprise-LBE-Bestcase
非企业版设备(具体设备型号查看相关章节),如果没有内置大空间功能,则需要使用第三方定位,例如 RTK、ubw。

通过 UE5 默认的 VR 项目模板,修改 SetTrackingOrigin 记录:(括号内为 UE5.3 及以前旧版本枚举选项)
OpenXR 有线串联模式下,Stage、View(eye、EyeLevel)、Local floor(StandFloor、FloorLevel)、Local(SitFloor)、customOpenXR 模式下,大空间标记障碍物和 VR 场景障碍物匹配。
Reset Orientation and Position 则以当前玩家的位置和头显正朝向作为场景默认初始点;
如果玩家朝向东南时触发重置头显,则在 VR 游戏内,现实世界的东南朝向为 VR 游戏内的正北。在大空间模式下需要特别注意重置头显操作,否则真实碰撞体和虚拟碰撞体不重叠,容易导致用户跌倒。
打包 Pico Android Apk,在 Stage、View(eye)、customOpenXR 模式下,则以应用启动的第一次玩家位置和正朝向作为场景默认初始点;
Local floor(StandFloor、FloorLevel) 站姿模式,正常实现大空间标记障碍物和 VR 场景障碍物匹配;
Local(SitFloor) 坐姿模式,正常实现大空间标记障碍物和 VR 场景障碍物匹配,角色模拟坐姿,现实站着对应着 VR 角色高度只有一半,未来可模拟动物 VR 视角。

PlayerStart 坐标如图左下角,真人位置如图右侧小红人。
在大空间项目场景,Pawn 在原地不同,用户带着头显走路,即为 Camera 移动坐标。

VRAF 框架坐标调整
笔者使用虚幻商城的 VR Advanced Framework 项目模板开发大空间 VR,该模板默认功能为:①项目运行启动后,以现实里的头显朝向为虚幻场景的正北 正 X 方向,因为根据目的地旋转值 Set Controller Rotation。
修改方法:把过渡蓝图的 BP_Transition 和 BP_PlayerPosition 的瞬移方法参数 UseRotation 改为 false。

②VRAF 框架源码在瞬移时设置了根据头显坐标重置了胶囊体位置,不适用于大空间,BP_Pawn_Base 的子类 BP_Pawn_VR 中屏蔽 AutoAdjustCapsulePosition 方法。


优化方法记录
常见问题总结
针对一体机开发打包 apk,使用 PicoXR 打包 apk,使用 picoOpenXR 打包 apk 或者 exe。PicoXR 和 PicoOpenXR 不能同时使用。使用 PicoXR 插件时,也不能勾选 OpenXR 插件。
PicoXR 文档 apk 开发注意事项
目前,在 UE5 中使用 PICO Unreal Integration SDK (PicoXR 插件只能打包 apk) 开发应用你需要注意以下事项:
- 需关闭 OpenXR 插件;
- UE5 不支持 OpenGLES,仅支持 Vulkan;
- 若仅左眼视图被渲染,可通过勾选 Moblie Multi-View 解决。
- SDK 不支持 Lumen。Lumen 不支持移动平台,有关 Lumen 的技术细节详见 官方文档。
- SDK 不支持 Nanite。目前 Nanite 只用在延迟渲染管线中,暂不支持移动端的前向渲染管线,有关 Nanite 的技术细节,详见 官方文档。
若你需在 UE5 中使用平台服务,除上述问题外,还需关注以下问题:
- Visual Studio 无法编译 Android Development Target 代码。
- WidgetInteraction 组件可能存在缺陷,会导致 3D UI 交互出现问题。(群友反馈 bug:VR 默认场景联机模式下,Menu 菜单被射线重复触发。因为联机才出现 bug,串流和 apk 都有可能出现,解决方法为,设置用户索引,或者偷懒使用 VR 框架模板)
- 对于播放 Animation Sequence,需要将 SkeletalMeshActor 下的 Visibility Based Anim Tick Option 参数的值修改为 Always Tick Pose and Refresh Bones。
如果使用 OpenXR 插件+PicoOpenXR 插件打包 apk,基本遵循上述条件;如果使用 OpenXR 插件+PicoOpenXR 插件打包 exe 串流,可以 Lumen 光追,但是代价特别卡,因为头显设备 2 个眼睛屏幕+PC 屏幕,性能开销特别大。
UE5.3 及以上版本的 MotionController 组件弃用了 DisplayDeviceModel 参数变量,无关紧要不影响,可以自定义在 MotionController 节点下添加 StaticMesh,赋予手柄模型用于显示设备。
追踪原点 SetTrackingOrigin 为 Local floor(StandFloor、FloorLevel) 站姿模式。
VR 串流显存占用高
如果开发 PC 串流 VR 项目,可以 SteamVR 串流或者 OpenXR 串流。
HTC VR 设备分辨率
截图记录为 SteamVR 串流+HTC VR(5K 头显和 3K 头显对比)
HTC VR SteamVR 串流对比
在 SteamVR 串流时,可以在 SteamVR 的设置修改串流时的单眼渲染分辨率。
3K 分辨率 100%,单眼分辨率 2016x2240
5k 分辨率 150%,单眼 5920x5920 相当于 8K 一只眼睛,双眼 8K x2 屏幕,再加上 PC 显示器,所以项目里 4090 显存 24G 爆满了,如图
默认即使不启动 VR 项目,头显观看 SteamVR 默认木屋大厅时,4090 显存占用 11.6G
解决方法
VivePro2 官网单眼分辨率显示是 2448x2448,SteamVR 相当于在高分辨率采样渲染输出 3 块屏幕,导致 VR 项目的性能占用特别高。所以关闭 lumen,降低渲染 SteamVR 分辨率,开启 DLSS 可以有效提高帧数。
开启 lumen,单眼分辨率 150%,5920x5920,大厅 10 帧
开启 lumen,单眼分辨率 100%,4832x4832,大厅 22 帧
关闭 lumen,单眼分辨率 100%,4832x4832,大厅 45 帧
开启 lumen,单眼分辨率 50%,3416x3416,大厅 45 帧,
3416x3416 = 3840x3038(参考系:3840x2400 4k)所以此时 50% 单眼渲染分辨率 3416x3416 依旧相当于 5K 单眼。
现场环境注意事项
上述 SteamVR 设置调整好,在办公室时 5K 头显流畅运行 VR,但是在展会现场时,因为周围相邻的展厅音响震耳欲聋,隔壁的射灯,瓷砖地板反射,导致 HTC 2.0 信号接收器数据不稳定,头显运行时间长导致过热,都会导致 5k 头显运行 VR 项目时变卡。
个人猜测最大原因是隔壁音响的震动,导致 HTC 2.0 信号器一直抖动(展会期间,音响一吵,5k 头显就变卡了)
解决方法是把 5k 头显换成 3k 头显,抗干扰性好,因为设备分辨率渲染输出压力没有 5k 头显那么大。
移动端优化工作流
移动端的法线贴图和热贴图显示不明显,可以删除节约性能,WorldPositionOffset 和 AmbientOcclusion 和 PixetDepthOffset 断开,
修改材质球中的金属值 0、镜面反射高光值 0、粗糙度 0.6~1,从向量计算改为固定值适用于移动端
Landscape 的 mobile 材质 使用全精度
移动端打包设置
缩小游戏压缩包:勾选 创建压缩烘焙包(Created compressed cooked package)
若安装 APK 文件至 PICO 设备时失败,并出现类似
Requires newer sdk version #30 (current version is #29) 的报错信息,
你需参考 配置 Android SDK 将 SDK API Level 设为 matchndk,将 NDK API Level 设为 android-29
使用虚幻引擎 5 打包的 Shipping 模式的 .apk 文件装到 PICO 设备中打开后,如果该应用亮灭屏后闪退,有可能是你在 编辑(Edit) > 项目设置(Project Settings) > 插件(Plugins) > AndroidFileServer 的 打包(Packaging)选卡下,取消勾选了 使用 AndroidFileServer(Use AndroidFileServer)。你需勾选该选项后重试。
VREP 开源模板的 Render 默认设置,可做打包 apk 时的参考:
移动端光照偏灰和 PC 预览不一致
PC 和移动端的光照环境的色差问题,打包 apk 的画面默认偏灰
1:修改预览设置改为 Android Vulkan Mobile,此模式下无法使用地编功能,画面偏灰。
2:添加后处理,把自动曝光改为手动,并修改曝光补偿为 10,此时预览 Android Vulkan Mobile 和 预览 D3D SM6 的对比 PC 画面、头显画面和 apk 打包头显画面,
仍有一点色差,apk 依旧偏灰一点,不确定如何更进一步优化,有知道的小伙伴欢迎进群讨论。
3:打包 apk 后,关闭自动曝光的环境光照色差和 PC D3D SM6 预览 和 PC Android Vulkan Mobile 预览近似。
移动端烘焙影子优化
UE5.4 里左眼阴影闪烁,除了定向光源属性不能是可移动,还可以通过控制台命令 r.Shadow.Virtual.OnePassProjection 0 解决灯光闪烁,
打包 apk 时,所有贴图纹理降低成最小的 mipmap 质量,包括烘焙的阴影贴图
论坛解决方法是渲染设置里关闭 TextureStream
慎用贴图选项勾选'Never Stream'属性则为永远不流送,同时把'Compression Settings'设置为'UserInterface2D'后,性能开销非常大,它永远都不会使用其他渐进纹理,即便它在屏幕中只占 200 像素或在屏幕上占用 2000 像素,开销是一样的。
移动端贴图模糊
- 降低边缘锯齿感:开启四倍抗锯齿(4x MSAA)
- 提升纹理清晰度:对所有纹理开启 Mipmap 与 Trilinear Filtering,并对墙面、地面等可能存在倾斜视角的纹理开启 Anisotropic Filtering。
细节(Details) 面板的 层次细节(Level of Detail) 选项卡中通过 Mip 生成设置(Mip Gen Settings) 自定义 mip-map 链内容的外观
使用三线性过滤(Trilinear Filtering)
使用各向异性过滤(Anisotropic Filtering)
与 Trilinear Filtering 相比,Anisotropic Filtering 的性能开销更高。建议仅为墙面、地面等有需要的纹理开启 Anisotropic Filtering 即可
大空间网络同步优化
企业版一体机用户可以使用 Pico 运营系统,pico 的运营播控系统提供了多个队伍之间的通讯以及显示队友形象的功能
有群友说尝试对接 pico 播控后接入失败,笔者未使用这方案。
笔者尝试过无 PC 服务器,直接一体机做内容服务器,FindSession 的 RPC 角色同步方案和 PC 做房主的内容服务器,
改成了 PC WebSocket 服务器,只发送接受头显坐标数据,然后一体机内接受队友头显坐标,创建一个 NPC 模拟队友进行同步移动,
最后改成了无 PC 服务器,每个一体机设备 udp 群发自身头显坐标,其他设备接受坐标后创建对应的 NPC。
因为笔者的 VR 项目,各个游客之间没有内容上的游玩互动,只需要显示队友位置,避免游客相互撞到即可。
Pico 官方运营播控系统
- 【导出内容动线】内容制作完成以后按照指定格式导出内容动线数据;虚拟内容动线数据导出说明
- 【内容客户端】入口函数接收启动命令行参数,基于参数实现内容玩法;播控命令行启动参数
- 【官方播控系统的内容服务器】
- 按照 33ms 间隔,收集内容当前所有玩家的进度信息,发送:标准内容同步指令,到指定服务器
- 接收桥接服务器发送过来的:标准播控指令,并在客户端实现对应的播控逻辑
- 收桥接服务器发送过来的**:标准玩家可见性数据指令**,在客户端显示其他内容的近距离玩家;
内容运营解决方案的播控系统的服务收费标准暂未知晓。Pico 官网收费:设企业设备管理平台收费标准:试用一年,29 元/台/月,299 元/台/年;其功能为设备管理同步地图数据。
串流 Wifi 信道问题记录
Pico 一体机如果搭配台式电脑主机使用,可以使用无线 Wifi 串流,
局域网 Wifi5G 支持 4 个客户端(4 台主机 4 台一体机),局域网 Wifi2.4G 支持 2 个客户端(2 台主机 2 台一体机)流程运行;
如果客户端过多,同个物理空间内 Wifi 信道重叠对网速有影响。
群友的经验:4080s 无线串联 Pico 设备,一台华硕八爪鱼的 wifi6 设备,开启 wifi-5G 信号只连接这 4 台主机 4 台 pico,4 台一体机都串流运行 pico 超清,头显串流的画面已经出现延迟拖影。
如果 2 台 wifi 设备放在房间两侧,通过 mesh 组网,当 4 台一体机同时呆在房间一侧,是不是出现 4 台一体机都自动连上这一侧的 wifi 设备,就容易导致一边的这台 wifi 设备出现高负载。
如果 2 台 wifi 设备用不同名字不同信道,且各自能翻盖全房间,是不是 1 台 wifi 设备只连接 2 台主机 2 台 pico,就能极大地改善串流延迟。
VR 视频清晰度不高的原因
提高视频分辨率,专属视频编码,例如 Pico 自带的全景视频复制到 PC 中则无法用 PopPlayer 播放器直接播放。
打包失败记录随笔
渲染闪退 硬件原因
打包 exe 时,提示 shader 材质球渲染相关报错,可能是 cpu 问题,重启电脑可以正常打包。
可能是 cpu 缩缸,在 bios 中关闭 xmp 自动睿频,或者关闭 EXPO,或者关闭 gameboost,再进行打包。
因为 14900kf 缩缸,降频降压使用,验证是否还能正常使用就是通过黑猴的着色器渲染的测试。
内存不足
因为项目资源太大,打包失败提示内存不足,有一台电脑 32g 内存添加 70g 虚拟内存后,就可以正常打包。
专属文件夹名称限制
Error:The following files are set to be staged, but contain restricted folder names (Desktop)
UE5 项目内不能使用 Desktop 作为文件夹名字,属于限制关键词,否则打包 android 失败。
Win10 系统打包 CPU 大小核调度不满
因为需要修改 render 配置和反复打包 apk,win10 系统的 cpu 在大小核调度上有问题,导致编译 shader 时 cpu 不能占用 100%,
解决方法是在引擎的 BaseEngine.ini 文件,
将 NumUnusedShaderCompilingThreads=3
改为 NumUnusedShaderCompilingThreads="你的数量(CPU 线程数量)"
我这里是改为 NumUnusedShaderCompilingThreads=32(14900KF 处理器拥有32 线程,基于 24 核心(8 个性能核与 16 个能效核))
在 BaseEngine.ini 文件,搜索 PercentageUnusedShaderCompilingThreads,把默认 50 改成 5。
Build Run 运行安装报错
如果直接 BuildRun 后想在真机上查看运行效果,真机最好需要按手柄按键或者戴上头显设备,目的是触发 adb 激活连接,激活 Pico 设备才可以正常自动打包、传输、启动 apk 后显示画面,否则有概率黑屏。
避免黑屏概率问题,推荐流程是先打包成 apk,然后手动鼠标双击 install.bat 文件安装 apk,再在一体机中用手柄射线启动 apk。
VR 模板映射 Pico 按键无抓握动画
使用 PicoOpenXR 或者 PicoXR 插件,在增强输入配置 Pico 设备的按键映射,VR 运行时抓握缺失部分动画,
可能是优先级问题,VRPawn 的 Begin 中的 AddMappingContext 优先级改为 1 即可
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online