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
  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之小地图的制作

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

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • 流程审批系统设计思路及实现方法

    背景 流程审批系统是一个很常见的系统 xff0c 包括我们在日常权限申请 xff0c 订单状态流转等很多场景都会接触 其核心的点有两个 xff1a 1 状态流转 2 流程驱动 我们以我们常见的流程审批为例 xff0c 比如我想向上街申请一台
  • 【问题】Ubuntu20.04桌面某些图标不显示

    问题 x1f631 xff1a 在桌面新建了test md xff0c 保存后关闭 桌面没有对应文件的图标 分析 x1f42f xff1a gnome shell问题 解决方案 x1f489 xff1a 重启gnome shell 按下al
  • 【python】连接远程服务器并传输文件,执行命令,传回文件

    使用Paramiko完成连接远程服务器并传输文件 执行命令 传回文件的功能 1 安装 pip install paramiko 2 config json nbsp nbsp file path home test test nbsp nb
  • centos7 安装GNOME 使用vnc连接

    1 xff1a 查看当前系统运行级别 命令 xff1a runlevel root span class hljs decorator 64 wst runlevel span N span class hljs number 3 span
  • 升级AS gradle错误

    错误信息 Direct local aar file dependencies are not supported when building an AAR 最近升级了AS和gradle 在编译时总是提示 gt Direct local a
  • 【项目实战】Spring体系结构与框架图

    一 Spring 体系结构 Spring 有可能成为所有企业应用程序的一站式服务点 xff0c 然而 xff0c Spring 是模块化的 xff0c 允许你挑选和选择适用于你的模块 xff0c 不必要把剩余部分也引入 下面的部分对在 Sp
  • sizeof的使用方法!!!

    sizeof xff08 int xff09 等的大小依赖于操作系统的位数 xff0c 如果是在 16 位 DOS 环境下 xff0c 用 TC 编译 xff0c 则为 2 xff0c 如果在 windows 环境下 xff0c 用 VC
  • sql中like的所有用法

    在sql结构化查询语言中 xff0c like语句有着至关重要的作用 like语句的语法格式是 xff1a select from 表名 where 字段名 like 对应值 xff08 子串 xff09 xff0c 它主要是针对字符型字段
  • FTP文件服务器拉取不存在的文件后出现连接不上的问题

    公司使用ftp作为各个业态文件交互中转站 xff0c 此FTP功能由我负责开发维护 开发使用的语言是java xff0c 初始化连接代码如下 xff1a span class token keyword public span FTPSCl
  • kali镜像下载官网地址

    http www kali org downloads
  • 如何powershell用7z命令批量压缩文件

    eidt by lfq date 20220915 use to 压缩 如何使用powershell执行7z命令 1 把压缩包里的两份文件放到C盘C Windows System32下 2 win 43 r输入cmd执行7z a file
  • Ubuntu20.04 安装 Google Chrome浏览器

    一 在 Ubuntu 上安装 Google Chrome 1 下载 Google Chrome 使用Ctrl 43 Alt 43 T快捷键或者点击终端图标 xff0c 打开你的终端 安装软件时最好是先更新一下 xff01 sudo apt
  • hexo博客5:更新部署&域名配置

    hexo博客5 xff1a 更新部署 amp 域名配置 一 Hexo更新二 部署脚本三 自定义域名四 参考 一 Hexo更新 管理员模式进入cmd hexo clean hexo generate hexo deploy 二 部署脚本 也可
  • Windows远程连接centos7图形化界面,安装xrdp

    Windows远程连接centos7图形化界面 xff0c 安装xrdp 写在最前面准备工作查看ubuntu系统的版本信息和gcc版本尝试进入图形化界面更新yum 下载安装图形化界面查询本地是否有Server with GUI group安
  • 华为机试—围棋吃子(下围棋)判决(高级题160分:深度优先遍历)(图文吐血整理)

    题目 xff1a 围棋中 xff0c 一个棋子在棋盘上 xff0c 与它直接紧邻的空点是这个棋子的 气 xff0c 棋子直接紧邻的点上 xff0c 如果有同色妻子存在 xff0c 则它们便相互组成一个不可分割的整体 xff0c 它们的 气
  • ConstraintLayout 通过setVerticalBias 实现动态设置控制位置

    使用场景 xff1a 设置布局的时候 xff0c 想通过ConstraintLayout实现滑块与文字同步移动 思路 xff1a ConstraintLayout在xml布局中有layout constraintvertical bias设
  • gdebi来安装依赖关系

    gdebi是一个用于安装你自己手动下载的包的GUI程序 GDebi也可以命令行模式运行 xff08 sudo gdebipackage deb xff09 xff0c 其功能和GUI模式下完全一样 安装 xff1a apt get inst
  • &和&&的区别?

    答 xff1a amp 运算符有两种用法 xff1a 1 按位与 xff1b 2 逻辑与 amp amp 运算符是短路与运算 逻辑与跟短路与的差别是非常巨大的 xff0c 虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是t
  • Spring的五种依赖注入方式

    平常的java开发中 xff0c 程序员在某个类中需要依赖其它类的方法 xff0c 则通常是new一个依赖类再调用类实例的方法 xff0c 这种开发存在的问题是new的类实例不好统一管理 xff0c spring提出了依赖注入的思想 xff
  • Unity VR游戏开发干货教程:优化VR体验

    简介 对于VR应用来说 xff0c 如果想要让用户获得好的用户体验 xff0c 特别是免除恶心眩晕的困扰 xff0c 在VR开发中进行优化是必不可少的 xff0c 惟其如此才能达到我们期望的游戏运行帧速 和其它平台上的开发不同 xff0c