Unity VR游戏开发干货教程:优化VR体验

2023-05-16

简介

对于VR应用来说,如果想要让用户获得好的用户体验,特别是免除恶心眩晕的困扰,在VR开发中进行优化是必不可少的,惟其如此才能达到我们期望的游戏运行帧速。和其它平台上的开发不同,对VR应用的优化应该在项目启动的前期就开始,而且应该贯穿始终,而不是像传统项目那样把优化的工作留到最后去做。此外,在目标设备上进行实际测试也是非常有必要的。

相比非VR项目来说,VR项目是非常消耗计算资源的,其主要原因就是所有的画面都必须为每只眼睛单独渲染一次。因此,在开发VR应用的过程中需要时刻想到这些问题。如果我们能在开启之前就想到这些问题,那么会节省大量的时间。

对于移动VR来说,优化工作就显得尤为重要。不仅仅是因为要运行VR应用,还因为移动设备的运算性能和散热性相比桌面电脑来说都要差上不少。

考虑到实现目标帧速是如此重要,所有的优化方法都必须考虑在内。我们需要在所有可能的地方优化项目代码,关于优化代码,可以参考Unity的Unity - Manual: Optimizing Scripts

Oculus的相关资源

在Oculus的官方网站上提供了大量关于如何优化VR应用的信息。

Unity Editor优化工具

Unity提供了一系列有用的工具和方法,可以帮助我们来优化VR内容。

The Profiler

profiler可以帮助开发者了解游戏中渲染每一帧所耗费的时间,并将其分为CPU、渲染、内存、音频、物理引擎和网络。学会如何使用Profiler对于检测游戏运行性能是至关重要的。

Frame Debugger

使用Frame Debugger可以让我们冻结某一帧,然后通过单独的draw调用来查看场景是如何生成的,然后来发现需要进行优化的地方。在这个过程中,我们可能会发现渲染了一些不必要进行渲染的对象,这样可以大幅度降低每帧的draw 调用。

VR应用优化的基础知识

考虑到对应用进行优化是个庞大的话题,对不同的平台有不同的要求,我们也提供了延伸阅读的相关信息。

通常来收,现有应用的优化技巧对VR开发也是适用的,因此这些知识也用得上。

Geometry(几何体)

在VR应用我们应尽量删除几何体中用户永远也不会注意到的面。我们没必要在场景中渲染出用户根本看不到的东西。比如,如果某个杯子背靠着墙壁,那么用户可能永远也不会看到它的背面,因此我们可以不必显示模型中的这些面。

对于3D美术设计人员,应该尽可能的简化模型设计。根据目标平台的不同,我们可能会需要查看纹理细节,或许还会希望查看视差映射贴图,和曲面细分。虽然这种方法可能会影响游戏性能,也可能对特定的平台根本无法使用。

Overdraw

Overdraw可以让开发者查看哪些对象绘制在其它对象的顶部,但其实是在浪费GPU时间。我们应尽可能的减少使用overdraw。我们可以使用Scene View Control Bar来查看场景视图中的overdraw。
 


正常的着色视图如下:
 


启用Overdraw之后的着色视图:
 


Level of Detail(LOD)细节层次

通过使用LOD,可以随着物体和摄像机之间的距离来减少物体渲染的三角形数目。除非所有的物体都离摄像机同样远,否则我们都可以使用LOD来减少硬件的负担。我们可以添加一个LOD组件,然后对远离摄像机的物体提供低精度模型。
 


使用Simplygon可以自动完成对大多数asset的LOD预处理。

Draw Call 批处理

我们应尽可能的通过Static Batching和Dynamic Batching来实现Draw Call 批处理。Draw Call批处理可以极大的提升游戏性能。具体请参考Unity官方指南的Draw Call Batching(。

Light mapping

尽可能减少动态光照,尽量多使用光照烘焙,尽量避免实时阴影。

关于这部分的具体内容,请参考Unity官方的Lighting and Rendering(Unity - Unity 5

Light Probes

使用Light probes可以让我们对场景中的光照点取样,然后应用到动态物体上。使用light probes通常更快,而且也能产生绝佳的视觉效果。

Reflection Probes

Reflection probes可以保存其周围的立方图,从而实现真实反射效果,而且也会对游戏性能产生影响。需要注意的是,目前在VR中使用实时reflection probes会导致游戏性能大幅降低。

Occlusion Culling

Occlusion Culling(遮挡剔除)可以避免渲染那些不可见的物体。例如,如果玩家正处于某个房间中,而另外一个房间的门是关闭的,那么对玩家来说另外一个房间中的所有物体都是不可见的,也就完全没必要进行渲染。

根据项目和目标平台的不同,我们可能会希望实现Occlusion Culling,从而大幅提升手游购买平台游戏性能。

下图是一个frustum culling(视锥体剔除)的示例:


下图是Occlusion Culling(遮挡剔除)的示例:
 


Anti-Aliasing(抗锯齿)

抗锯齿对VR应用来说非常重要,因为使用这种技术可以让图像的边缘显得更加平滑,并减少毛边线下。如果我们在项目中使用Forward Rendering,那么就需要在Quality Setting中启用MSAA。而对于Gear VR项目来说,任何时候我们都需要启用该选项。

当然,在使用Deferred Rendering时我们无法启用MSAA,此时需要启用AntiAliasing作为后处理特效(所谓的“反走样”),或者考虑使用SMAA。

这里提供了一个相关的示例。

GitHub - Chman/SMAA-Unity: A highly customizable implementation of Subpixel Morphological Antialiasing for Unity3D. 

Textures

通常来说,在VR项目中我们应尽可能的使用Texture Atlasing(纹理贴图),以减少单独纹理和材质的使用量。

为简化和加速这个过程,我们可以考虑使用MeshBaker来烘焙游戏中所使用的纹理、模型和材质。

在Oculus Connect 2开发者大会上,来自Turbo Button的Holden曾分享过优化应用以及使用MeshBaker的相关经验。

有一点需要注意的是,在VR项目中normal maps看起来效果并不好,因此我们应该避免使用。)。

Shaders

在VR项目中,我们应尽可能使用最基本的shader。在Gear VR上,我们可能会需要考虑使用不那么消耗资源的Mobile>Unlit(Supports Lightmap) shader,并使用lightmap来给场景提供光照。

Fullscreen Effects(全屏特效)

对VR项目来说Fullscreen Effects过于奢侈,因此我们应在Gear VR项目中完全避免使用。

Quality Settings

Quality Settings中的选项将直接影响项目的视觉效果。通过调整这些属性,可以某种程度的提升游戏性能,当然代价就是牺牲了部分视觉效果。

RenderScale

调整VRSetting.renderScale可以牺牲画质换取更高的游戏性能。具体可以参考本系列教程的第二篇。

Asynchronous Loading

为了提升性能,我们可以考虑把游戏场景分成诸多小的场景。不过这样做需要注意的是,在加载下一个场景的内容时,应该避免锁定对头部的跟踪,以免产生nausea恶心现象。

为避免出现这种情况,我们可以考虑设计一个允许头部运动跟踪的加载场景,让游戏异步加载新的场景,具体的方法是使用SceneManager.LoadSceneAsync。

示例场景中所用到的优化技巧

为了让用户在DK2和Gear VR上面获得更好的体验,我们在示例场景中使用了一系列的优化技巧。

考虑到我们需要让同一个项目支持两个凭条,因此需要考虑对最低端性能设备的支持,也就是Gear VR。我们选择了低多边形的艺术风格,并使用少量的基本色彩,让物体从环境中脱颖而出。

在使用Forward Rendering时,我们需要在Edit > Project Settings > Quality Settings 中启用4x MSAA,以便获得更好的视觉效果:
 


让我们简单看看这些场景中所使用的优化技术:

Menu 场景中使用的优化技术:

跟该项目中所有的场景一样,Menu场景中使用了低多边形的美术资源,而且避免使用实时光照。

我们在菜单面板上使用了定制的shader,名为SeparableAlpha,可以为一系列的图像定义独立的alpha通道。这就意味着不是每一帧都需要自己的alpha通道。这样做可以节省文件大小,并去掉某些贴图。

Flyer 场景中使用的优化技术:

我们在Flyer场景中动态启用了fog,从而避免让物体突然跳进玩家的视野,并缩短了视距,这也就意味着减少了所需渲染的物体数量。

场景中陨石的顶点数较低,从而可以通过Dynamic Batching来减少draw call。

为了重用某些物体,我们创建了一个对象池,以处理激光、陨石和星门这样的对象。通过这种方式,可以避免昂贵的初始化调用。

对于Flyer场景中的飞船纹理我们同样做了优化,通过使用Detail Map slot中的次级UV 通道,可以只需使用更少的色块。这样一来我们就可以缩减总体的纹理大小。

Maze场景中的优化技术

Maze场景中使用了lightmap,从而在运行时获得更好的性能,特别是在Gear VR上。除此之外,该场景没有任何的实时光照和特效。

Shooter180(Target Gallery)和Shooter360(Target Arena)中的场景优化

和其它游戏一样,我们在这些场景中沿用了低多边形风格,并为目标对象创建了object pooling。同时我们使用了低顶点数以启用Dymaic Batching。

看完本篇教程,大家对VR游戏优化应该有了整体的印象,也大概了解了我们应如何使用Unity内置的工具来分析游戏性能,以及如何通过某些技巧来获得更好的游戏表现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity VR游戏开发干货教程:优化VR体验 的相关文章

  • 一些个人常用的网站网址

    一些个人常用的网站网址 GitHub https github com Gitee https gitee com 1 书栈网 https www bookstack cn explore cid 27 tab popular 2 Unit
  • 【Unity2d】带你制作一款类似于金山打字的小游戏

    博主大概08年开始接触电脑游戏 当时玩的是我哥的电脑 那时候家里没网 只可以玩电脑上自带的单机游戏 比如扫雷 蜘蛛纸牌等等 当然还有红色警戒 冰封王座 星际争霸 帝国崛起等等 这些大概是我哥当时在大学下载的 也是那个时候对游戏充满了兴趣 记
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • c#获取cpu序列号

  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin

随机推荐