虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
大空间头显坐标朝向
一体机p4ue设备开启大空间定位识别,并框选障碍物范围,暂时不用Marker贴图精细定位。
大空间一体机范围设置文档:https://business.picoxr.com/cn/doc/Enterprise-LBE-Bestcase
非企业版设备(具体设备型号查看02章节),如果没有内置大空间功能,则需要使用第三方定位,例如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移动坐标。
元小先VR大空间移动教程
详细视频教程可查看元小先VR大空间移动方案:https://www.bilibili.com/video/BV1BRN3eYEgM
Up主推荐使用VREP项目模板进行开发,移动时有SetActorLocationVR方法调用,可以快速移动Camera到目标位置。
使用SetActorLocation也可以,需要自己封装个方法计算目标位置的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方法。
优化方法记录
元小先常见问题总结
PicoXR文档apk开发注意事项
- 需关闭 OpenXR 插件;
- UE5 不支持 OpenGLES,仅支持 Vulkan;
- 若仅左眼视图被渲染,可通过勾选 Moblie Multi-View 解决。
- SDK 不支持 Lumen。Lumen 不支持移动平台,有关 Lumen 的技术细节详见 官方文档。
- SDK 不支持 Nanite。目前 Nanite 只用在延迟渲染管线中,暂不支持移动端的前向渲染管线,有关 Nanite 的技术细节,详见 官方文档。
- 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。
VR串流显存占用高
如果开发PC串流VR项目,可以SteamVR串流或者OpenXR串流。
项目推荐关闭Lumen,否则性能开销特别大。
HTC VR 设备分辨率
截图记录为SteamVR串流+HTC VR(5K头显和3K头显对比)
VivePro2头显(5K分辨率,单眼2448x2448,双眼4896x2448)https://www.vive.com/cn/product/vive-pro2-full-kit/specs/
VivePro头显(3K分辨率,单眼1440x1600,双眼2880x1600)https://business.vive.com/cn/product/vive-pro/
Pico4UE头显(4k+分辨率,单眼2160x2160,双眼4320x2160)https://www.picoxr.com/cn/products/pico4-ultra-enterprise/specs
分辨率参考 https://www.zhihu.com/tardis/bd/ans/2390237910?source_id=1001
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头显那么大。
移动端优化工作流【视频时长1小时】
https://www.bilibili.com/video/BV1GC4y1H71i
移动端的法线贴图和热贴图显示不明显,可以删除节约性能,WorldPositionOffset 和AmbientOcclusion和 PixetDepthOffset断开,
修改材质球中的金属值0、镜面反射高光值0、粗糙度0.6~1,从向量计算改为固定值适用于移动端
模型lod处理
实例化静态模型
Landscape的mobile材质 使用全精度
移动端打包设置
PicoXR 打包文档:https://developer-cn.picoxr.com/document/unreal/package-and-install/
缩小游戏压缩包:勾选 创建压缩烘焙包(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预览近似。
移动端烘焙影子优化
https://forums.unrealengine.com/t/shadows-flickering-in-vr-ue5-4-3/1946752/3
UE5.4里左眼阴影闪烁,除了定向光源属性不能是可移动,还可以通过控制台命令r.Shadow.Virtual.OnePassProjection 0 解决灯光闪烁,
但是它禁用了优化,所以预期会有轻微的帧数下降。
打包apk时,所有贴图纹理降低成最小的mipmap质量,包括烘焙的阴影贴图
论坛解决方法是渲染设置里关闭TextureStream

贴图设置UE文档 https://dev.epicgames.com/documentation/en-us/unreal-engine/texture-support-and-settings?application_version=4.27
UE5.6纹理流送文档 https://dev.epicgames.com/documentation/zh-cn/unreal-engine/texture-streaming-in-unreal-engine
纹理流送参考 https://zhuanlan.zhihu.com/p/166132161
https://gwb.tencent.com/community/detail/110353
https://baijiahao.baidu.com/s?id=1705093428392181312&wfr=spider&for=pc
慎用贴图选项勾选 “Never Stream” 属性则为永远不流送,同时把 “Compression Settings” 设置为 “UserInterface2D” 后,性能开销非常大,它永远都不会使用其他渐进纹理,即便它在屏幕中只占 200 像素或在屏幕上占用 2000 像素,开销是一样的。
移动端贴图模糊
- 降低边缘锯齿感:开启四倍抗锯齿(4x MSAA)
- 提升纹理清晰度:对所有纹理开启 Mipmap 与 Trilinear Filtering,并对墙面、地面等可能存在倾斜视角的纹理开启 Anisotropic Filtering。

使用三线性过滤( Trilinear Filtering)

使用各向异性过滤(Anisotropic Filtering)

大空间网络同步优化
企业版一体机用户可以使用Pico运营系统,pico的运营播控系统提供了多个队伍之间的通讯以及显示队友形象的功能
有群友说尝试对接pico播控后接入失败,笔者未使用这方案。
笔者尝试过无PC服务器,直接一体机做内容服务器,FindSession的RPC角色同步方案和PC做房主的内容服务器,
改成了PC WebSocket服务器,只发送接受头显坐标数据,然后一体机内接受队友头显坐标,创建一个NPC模拟队友进行同步移动,
最后改成了无PC服务器,每个一体机设备udp群发自身头显坐标,其他设备接受坐标后创建对应的NPC。
因为笔者的VR项目,各个游客之间没有内容上的游玩互动,只需要显示队友位置,避免游客相互撞到即可。
Pico官方运营播控系统
- 【导出内容动线】内容制作完成以后按照指定格式导出内容动线数据;虚拟内容动线数据导出说明
- 【内容客户端】入口函数接收启动命令行参数,基于参数实现内容玩法;播控命令行启动参数
- 【官方播控系统的内容服务器】
- 按照33ms间隔,收集内容当前所有玩家的进度信息,发送:标准内容同步指令,到指定服务器
- 接收桥接服务器发送过来的:标准播控指令, 并在客户端实现对应的播控逻辑
- 收桥接服务器发送过来的:标准玩家可见性数据指令,在客户端显示其他内容的近距离玩家;
串流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视频清晰度不高的原因【转载地址】
https://xie.infoq.cn/article/675d891772cfd630826ff1d5f
提高视频分辨率,专属视频编码,例如Pico自带的全景视频复制到PC中则无法用PopPlayer播放器直接播放。
打包失败记录随笔
渲染闪退 硬件原因
打包exe时,提示shader材质球渲染相关报错,可能是cpu问题,重启电脑可以正常打包。
可能是cpu缩缸,在bios中关闭xmp自动睿频,或者关闭EXPO,或者关闭gameboost,再进行打包。
因为14900kf缩缸,降频降压使用,验证是否还能正常使用就是通过黑猴的着色器渲染的测试。
内存不足
因为项目资源太大,打包失败提示内存不足,有一台电脑32g内存添加70g虚拟内存后,就可以正常打包。
Win10电脑虚拟内存设置方法
https://www.192ly.com/pc/win10/win10-sz-xn-nc.html
专属文件夹名称限制
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个能效核))
如果上述方法没有提升,
使用另一种方法,对大小核CPU调度有明显提升
在BaseEngine.ini文件,搜索 PercentageUnusedShaderCompilingThreads,把默认50改成5。
或者升级win11系统,提高大小核调度。
Build Run 运行安装报错
如果直接BuildRun后想在真机上查看运行效果,真机最好需要按手柄按键或者戴上头显设备,目的是触发adb激活连接,激活Pico设备才可以正常自动打包、传输、启动apk后显示画面,否则有概率黑屏。
避免黑屏概率问题,推荐流程是先打包成apk,然后手动鼠标双击install .bat文件安装apk,再在一体机中用手柄射线启动apk。