Pico Unity VR游戏开发实战——性能优化基础

新闻资讯 网络整理

关于Pico

在这样的特殊时期,居家娱乐变得非常火热。除了日常的大屏观影和主机游戏之外,越来越多的人开始把玩起了取得长足进步、可玩性不断提升的VR设备,Pico Neo 3就是其中的新旗舰。

Pico致力于VR头显产品的研发、生产、销售,特别专注于VR一体机这一形态产品。Pico兼顾C端消费者市场与B端行业市场,同时为大众VR用户与行业客户提供VR产品与服务。Pico领域辐射教育、娱乐、企业培训等方面。业务逐步由中国本土推向全球——北美、韩国、欧洲和日本。今天我们一起来看看Pico团队的优秀开发者们在Pico Unity VR游戏开发实战中的相关经验和案例。

性能目标

Pico Neo 3 硬件规格

首先,我们来看一下 Pico Neo 3 的硬件规格 :

Pico Neo 3

分辨率

4 K (3,664 × 1,920)

屏幕刷新率

72/90/120 Hz

FOV

98°

SoC

高通骁龙 XR2

内存

6 GB

闪存

128/256 GB

Wi-Fi

WIFI 6 (802.11ax)

追踪类型

6 DoF

手柄

两只 6 DoF 手柄(红外光学追踪)

电池

5300 mAh

摄像头

四个单目鱼眼相机

眼球追踪

N/A

骁龙 XR2 是高通在 2019 年底发布的 XR 平台 Soc ,属于同期推出的手机平台 SoC 骁龙 865 (采用的手机主要有小米 10、三星 S20 等)的衍生版;由于高通官方没有给出 XR2 的具体规格,我们可以参考骁龙 865 的规格:

结合网上的信息,我们可以猜测骁龙 XR2 的整体性能与骁龙 865 相当,GPU性能可能稍高于 865

游戏开发实战_实战开发游戏有哪些_开发游戏的游戏

VR游戏性能要求

为了尽量缓解晕动症,VR游戏需要尽量降低渲染耗时即提高游戏帧率, Pico 官方在 Neo 3 上给出的游戏性能目标为FPS 至少达到 72 帧/秒(Neo 3 屏幕刷新率最低为 72 Hz);而目前手游在高端手机上的帧率上限一般为 60 帧/秒

(少部分手机屏幕支持超高刷新率的会达到 90 或以上),且 VR 一体机的屏幕分辨率比手机明显高一档(4k 级 vs 2k 级),可见,在 SoC 整体性能相当的情况下,VR 一体机比手机在性能上面临更严峻的挑战。

游戏性能目标:

开发游戏的游戏_游戏开发实战_实战开发游戏有哪些

Pico官方给出的Pico Neo 3性能目标

性能问题

为了方便后续 VR 一体机游戏相关的测试调研,我们使用 Unity 制作了一个 Pico VR 游戏 Demo 。当游戏 Demo 完成第一个可玩版本时,我们把项目构建到 Pico Neo 3 上运行,然而真机运行的结果让人出乎意料, Demo 的关卡玩法非常卡顿,经过测试发现帧率仅有 20 多,距离 Pico 官方给出的性能目标差距甚远。

开启 FPS 显示

为了方便确认游戏的帧率表现,我们需要有一种便捷的方式显示游戏的帧率。其实在 Unity 编辑器中创建 XR Origin 时,Pico SDK 已经帮我们创建了在场景中显示 fps 的游戏对象(默认不显示),我们只需将其开启即可:

游戏开发实战_实战开发游戏有哪些_开发游戏的游戏

实战开发游戏有哪些_开发游戏的游戏_游戏开发实战

实战开发游戏有哪些_游戏开发实战_开发游戏的游戏

开发游戏的游戏_实战开发游戏有哪些_游戏开发实战

问题定位

游戏 Demo 的功能比较简单,按理来说 CPU 侧逻辑计算压力很小,而从渲染层面来看,场景内的物体渲染也比较简单,但为了提升质感,场景开启了泛光和渐晕两个全局后处理特效,因此我们首先怀疑后处理特效的性能开销过大。经过验证,只把两个后处理特效关闭,游戏能够保持满帧( 72 帧/秒)运行,于是基本可以将问题原因锁定在后处理特效开销过大。

我们直接使用了 Unity Post Processing Version 2 插件提供的后处理特效,如果出现性能开销过大的问题,说明目前使用的渲染管线性能表现不理想,那么我们应该考虑更换性能更好的性能管线。

性能优化

之前在创建VR项目时我们使用了 Unity 默认的 3D 项目模板,该模板使用的是 Unity 内置渲染管线( Unity Built-in Render Pipeline );这个渲染管线默认没有针对移动端进行太多优化,性能表现较为一般,为了解决上面的性能问题,我们可以尝试更换为其他性能更好的渲染管线。

根据Unity的官方文档 ,目前 Unity 提供了四种渲染管线:

其中,URP管线有针对移动端进行优化,性能比内置管线更好,而且使用门槛相对低,符合我们目前的需求。

Unity官方文档:

内置渲染管线:

通用渲染管线(URP):

高清渲染管线(HDRP):

使用URP管线

根据官方文档 ,使用 URP 管线有两种方式:既可以在已有项目的基础上切换至 URP 管线,也可以在新建项目时直接使用 URP 管线。

官方文档:@12.1/manual/InstallURPIntoAProject.html

已有项目切换至URP管线

Demo 项目之前使用了内置渲染管线,根据以下步骤切换至 URP 管线:

开发游戏的游戏_游戏开发实战_实战开发游戏有哪些

删除原有内置管线后处理相关的内容

删除场景中后处理相关的游戏对象和组件,切换至 URP 管线后需重新创建

打开 Window > Package Manager ,找到并删除 Post Processing Version 2

安装 URP 插件:打开 Window > Package Manager ,切换至 Package: Unity Registry,往下滚动找到 Universal RP ,选中并点击右下角的 Install

实战开发游戏有哪些_游戏开发实战_开发游戏的游戏

配置 URP :

a.创建 Universal Render Pipeline Asset:在 Project 窗口新建一个目录 URP 并进入,然后空白处右键打开菜单,依次选择 Create > Rendering > URP Asset (with Universal Renderer)

游戏开发实战_实战开发游戏有哪些_开发游戏的游戏

b.添加 URP Asset 至 Graphics 配置:

将新建的 URP Asset 添加至 Graphics 配置中,否则Unity 将继续使用内置的渲染管线。

游戏开发实战_开发游戏的游戏_实战开发游戏有哪些

c.禁用 HDR :URP管线默认开启 HDR ,在 VR 一体机上性能开销较大,不建议开启;取消勾选将其关闭

实战开发游戏有哪些_开发游戏的游戏_游戏开发实战

升级 Shader :原有的材质使用了内置渲染管线的 shader ,需要升级为 URP 管线的 shader ,否则会出现材质丢失(材质变紫色)的情况

在 Project 窗口中选中需要升级的材质,在上方菜单栏处,选择 Edit > Render Pipeline > Universal Render Pipeline > Upgrade Project Materials to UniversalRP Materials

实战开发游戏有哪些_游戏开发实战_开发游戏的游戏

如果有其他需要升级的 shader ,可以参考 Unity 官方提供的对照关系通过手动更改 shader 的方式进行升级

对照关系:@12.0/manual/upgrading-your-shaders.html

重新添加后处理效果

a.设置抗拒齿:

在 Hierarchy 选中 Main Camera ,Inspector 窗口中 Camera > Rendering > Anti-aliasing 选择 FXAA

实战开发游戏有哪些_游戏开发实战_开发游戏的游戏

b.添加后处理特效:

在 Hierarchy 选中 Main Camera ,Inspector 窗口中找到 Camera > Rendering > Post Processing 并勾选,开启后处理

游戏开发实战_实战开发游戏有哪些_开发游戏的游戏

在场景中新建一个空对象 PostProcessing ,专门用于添加后处理特效

选中 PostProcessing 对象,添加 Volume 组件;添加后, Volume 组件的 Profile 字段默认是 None ,点击右侧的 New ,添加新的 Profile

游戏开发实战_实战开发游戏有哪些_开发游戏的游戏

添加 Profile 后,点击下方的 Add Override,选择 Post-processing > Bloom 和 Vignette,添加泛光和渐晕两个特效

游戏开发实战_开发游戏的游戏_实战开发游戏有哪些

游戏开发实战_开发游戏的游戏_实战开发游戏有哪些

v. 开启泛光和渐晕,并调整特效参数

游戏开发实战_实战开发游戏有哪些_开发游戏的游戏

至此,渲染管线切换成功,重新构建项目至 Pico 设备上,发现使用 URP 管线后,在同样开启两个全局后处理特效的情况下,游戏 Demo 关卡玩法的帧率从之前的20多提升至72(满帧),已满足 Pico 官方的性能要求。新创建项目时使用URP管线

对于新创建项目的情况,可以在使用 Unity Hub 创建项目时直接使用 URP 管线的项目模板,首次使用 URP 管线 3D 模板前需要下载,详情参考下方链接;

Using the Universal Render Pipeline in a new Project | Universal RP | 12.0.0:@12.0/manual/creating-a-new-project-with-urp.html

开发游戏的游戏_实战开发游戏有哪些_游戏开发实战

注意事项

根据 Pico官方的提示 ,使用 URP 管线时有以下两个注意事项:

因此,在项目中,抗锯齿我们使用的是 FXAA ,并在 Edit > Project Settings > Player > Settings for Android > Other Settings > Rendering 中,取消勾选 Auto Graphics API,并在 Graphics APIs 中去掉 Vulkan

开发游戏的游戏_游戏开发实战_实战开发游戏有哪些

其他性能优化项

除了更换渲染管线之外,Pico官方也提供了两个可选的性能优化设置,即开启注视点渲染和 Multiview

开启注视点渲染

注视点渲染(Foveation Rendering)可以优化 VR 场景的渲染,该技术通过为视野中心提供全分辨率(无损),降低周边视野(人眼焦点区域之外)分辨率的方式来达到优化渲染的目的,更多细节见官方说明文档

官方说明文档:#id5

注视点渲染的开启方式:Hierarchy 中选中 XR Origin 对象,在 PXR_Manager 组件中调整 Foveation Level 的值即可

游戏开发实战_开发游戏的游戏_实战开发游戏有哪些

开启 Multiview

基于 Unity 引擎的 XR 单通道立体渲染(Single Pass Stereo Rendering),用一个摄像机实现立体渲染,比使用两个摄像机减少一半的 DrawCall 和遮罩剔除,对复杂的场景帧率提升明显,但是 Multiview 模式不支持屏幕后处理。

开启 Multiview 的方法:打开 Edit > Project Settings,选择 XR Plug-in Management > PicoXR ,切换至安卓选项卡,Stereo Rendering Model 选择 Multiview

游戏开发实战_开发游戏的游戏_实战开发游戏有哪些

相关工具

Pico官方文档推荐了一系列在性能优化时可以使用的工具:

Pico Metric Tool:

Unity Profiler:

Frame Debugger:

查看Overdraw: Snapdragon Profiler Tools & Resources: 实时预览工具(Preview Tool):

此外,由于 Pico VR 一体机的操作系统是基于安卓定制的,安卓 Unity 手游开发可用的性能调试工具都可以尝试在 Pico VR 一体机上进行使用。

配置应用帧率上限

Pico应用默认的帧率上限为 72 ,如果希望提供更高的帧率,参考官方文档进行设置,目前可支持设置的帧率上限有 72、90 和 120 Hz,其中 120 Hz 刷新率需要设备系统软件版本为 c000_rf01_bv1.0.1_sv2.29_20220121_b384 及以上并且在设备系统设置中开启才能支持

游戏开发实战_开发游戏的游戏_实战开发游戏有哪些

总结

一方面,为了保证玩家在 VR 中有较好的游戏体验,相比手游,VR 游戏具有更高的性能目标;另一方面,VR 一体机的硬件算力受限,这导致 VR 一体机在性能上面临严峻的挑战。因此,在 Pico 上开发 VR 游戏时,建议开发者时刻关注游戏的性能表现,及时采取必要的优化措施达到性能目标。