12个Unity5中优化VR 应用的技巧
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/50176429
作者:cartzhang
12个Unity5中优化VR 应用的技巧
VR应用比非VR应用需要更强的计算,性能优化是一个很重要的任务。若目标平台是像GearVR这样的手机设备,优化就更重要了。
以下是一些应该试着了解的性能指标:
· 每只眼睛50次绘制调用。Unity5更精确地将其称为SetPass Calls。
· 场景中顶点数少于50K~100K 且面数少于50~100K 。
下面是一些简单的技巧,用于满足上述要求:
静态批处理
场景中可能存在大量的静态几何体,例如墙体,椅子,灯光和从不移动的网格。在编辑器中将它们标记为静态对象。为烘焙光照贴图,请确保将其标记为静态贴图。不要让每个对象都会导致一次绘制调用,而是把对象标记为可被组合成一个网格的静态对象。
静态批处理有个关键要求:所有对象必须使用相同的材质。若静态墙带有木头材质,静态椅子带有铁材质,所有墙会被批量处理为一次绘制调用,椅子作为单独网格进行另外的绘制调用。
纹理集
如之前所说,每个材质引发一次绘制调用。直觉可能是木门和铁椅子需要使用不同的材质,由于它们的纹理不同。然而,若使用相同的着色器,就可以用纹理集为它们创建共用的材质。纹理集就是一个包含所有小纹理的大纹理。我们可以使用一个材质加载一个纹理,而非使用多个材质加载多次。每个对象可以对应到纹理集中不同坐标的一个纹理。
你可以的绘制管线中手动生成纹理集,但是Juan Sebastian的Pro Draw Call Optimizer工具非常有用。它可以生成纹理集,并且在替换新对象时不会搞混资源。
动态批处理
非静态对象可以动态批处理为一个单独的绘制调用。我曾注意到该过程大量占用CPU且每帧都在计算,但这是一个很好的优化。这只对使用相同材质且顶点数少于900的对象有效。使用纹理集为所有的动态对象创建一个材质,就可以进行简单的动态批处理啦。
LODs(多细节层次)
LOD组是改善性能的简便方法。使用有多个LOD的资源,并用低分辨率的几何体渲染离相机远的对象。Unity可以自动随着相机临近在各个LOD间转换。
填充率,过度绘制和裁剪
这是个值得关注的话题。减少过度绘制,最远的对象最先绘制,随后中上面依次绘制更近的对象。这个在平均分辨率为1080P的PC显示器上没什么问题,但对于有极高分辨率的VR和手机设备来说问题就比较严重。大量的过度绘制组成了大量像素从而影响填充率。纹理 填充率是限制GPU性能的关键。
一些解决方案提供了遮挡剔除和视锥体剔除。视锥体剔除是指不渲染位于相机视锥体外的对象。不渲染看不到的对象!遮挡剔除是剔除被其它对象挡住的对象。比如,门后的房间可以被整体剔除。默认情况下,遮挡剔除是针对整个场景的,如果关卡设计得当甚至可以让你剔除游戏中的整个关卡。
LOD组当然也可以裁剪离场景很远的对象,进一步使填充率最小化。
关卡设计
若游戏涉及到玩家从一个房间移到另一个房间,简单的解决方法是一个关卡包含整个游戏。缺点在于内存的消耗。尽管每个房间中的各对象和材质都不可见,但其仍会被加载到内存中。将每个房间放置于单独的关卡中,在代码中智能的异步加载关卡可以改善性能。
异步加载
在玩家即将进入下个房间之前,加载下一个关卡。不要使用Application.LoadLevel()同步加载,因为加载时会导致游戏挂起。由于头盔的跟踪是实时的,这会导致眩晕,对玩家来说体验太糟糕。
使用Application.LoadLevelAsync()来加载关卡。你可以在Oculus Mobile SDK BlockSplosion例子的StartupSample.cs中找到使用方法。
光照烘焙
关掉实时阴影!接受动态阴影的对象不会被批处理,这会导致严重的绘制调用。
在PC机上,使用单个实时方向光就可以实现很好的动态阴影效果。对于大多数现代的PC都可以提供逼真的逐像素阴影。然而在移动平台,你需要烘焙光照而不是实时阴影,以高分辨率烘焙光照结合软硬阴影实现类似的效果。
阴影
尤其是为了高性能的手机体验,对于3D对象的阴影处理要使用传统技巧。可以通过在对象下放置一个简单的带有模糊阴影纹理的2D四边形模拟半真实的阴影。
VR提示:不要尝试使用阴影缓冲。预处理光照环境并在角色下方使用老套的模糊阴影纹理处理方法。
例如,你Hold不住像《GTA V》中这种在高性能PC机上使用的实时动态阴影。
用如下方法代替:这是一张2002年《GTA Vice City》的游戏截图,你可以在Playstation 2上使用阴影斑点来提供阴影效果的幻觉。
光线探测器
当使用烘培光照时,静态对象效果不错但动态对象有点欠妥。对于动态对象可以使用光照探针来模拟简单的动态光照。
光照探针是烘焙好的立方贴图,存储了场景中多个点直接、间接甚至自发光的信息。当动态对象移动时,它在光照探测器附近进行插值获取近似某个点的光照。这是一种在动态对象上模拟实时光照的简便办法,而不用成本高昂的实时光照。
Unity的文档解释了光照探针要如何放置。
避免使用透明和多个材质的对象
类似玻璃这种使用透明着色器的对象很消耗性能。使墙壁看起来更逼真的常见做法是,用一个带有灰尘或锈斑纹理的透明材质,加上另一个单独的基本漫射材质。多材质的alpha混合是很消耗性能的,每个材质都会增加一次绘制调用!但是请注意:多个纹理并没有问题,使用多个材质才耗费性能。使用一个材质结合着色器来实现多纹理的alpha混合,而非使用多个单独材质。
蒙皮网格渲染器
蒙皮网格渲染器常用于角色身上,它带有动画关节,可以使用物理(布娃娃)变或自定义动画(走,跳等)来实现逼真的网格变形。
坏消息是:蒙皮网格渲染器不支持批处理。对于每只眼睛,场景中各角色都会进行多次绘制调用。目前还没什么解决方案。
扩展阅读
推荐大家观看Oculus大会上关于GearVR的开发演讲。
原文链接:
链接:http://dshankar.svbtle.com/performance-optimization-for-vr-apps
作者:DARSHAN SHANKAR
-----
若有问题,请随时联系!
非常感谢!
--------------
再次感谢可爱的刺酱为本文做的努力!!辛苦!
12个Unity5中优化VR 应用的技巧的更多相关文章
- Unity5.3官方VR教程-系列1
如果你不是VR游戏或应用的开发者,可以选择无视下面的内容,这不是给普通用户看的~ 如果你之前曾经为Oculus Rift DK2或者Gear VR开发过,那么心里面一定曾经有千万个草泥马来回奔跑过.虽 ...
- Unity5中叹为观止的实时GI效果
http://www.manew.com/thread-43970-1-1.html 今天为大家分享unity与Alex Lovett共同使用unity5制作的Shrine Arch-viz Demo ...
- 使用Unity5.1进行VR开发的配置(最新的未必是最好的!!!)
随着Unity5.1的发布,之前的Oculus Rift和Gear VR 开发流程发生了巨大的变化,这也算是小白鼠们必须付出的代价了~ 那么Unity5.1和Oculus的整合究竟发生了哪些变化,对开 ...
- 在unity5中减少Draw Calls(SetPass Calls)[转]
在unity5中减少Draw Calls(SetPass Calls) 我一直工作于unity5支持的Standard Shader(标准着色器)上,并且做了一些关于如何有效地减少draw cal ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 优化VR体验的7个建议
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/50392607 作者:ca ...
- JVM中优化指南
JVM中优化指南 如何将新对象预留在年轻代 如何让大对象进入年老代 如何设置对象进入年老代的年龄 稳定的 Java 堆 VS 动荡的 Java 堆 增大吞吐量提升系统性能 尝试使用大的内存分页 使用非 ...
- 在Unity 5中优化SkinnedMeshRenderer
过早优化是万恶之源”——Donald Knuth 不少开发者在前期开发过程中对算法等类似的开销都甚少关心,而是更倾向于尽可能简单的解决某个问题,后面必要时再进行优化.这能极大加速开发进度 ...
- odi 12.2.1中访问excel文件
由于在odi 12.2.1中,必须使用jdk1.8,而jdk1.8中jdbc-odbc bridge已经不再支持,因此,可以使用Progress DataDirect SequeLink来充当jdbc ...
随机推荐
- poj 3311 Hie with the Pie (状压dp) (Tsp问题)
这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...
- Crontab入门基础
Crontab入门基础 crontab前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那 ...
- ThinkPHP 跨模块调用操作方法(A方法与R方法)
ThinkPHP 跨模块调用操作方法(A方法与R方法) 跨模块调用操作方法 前面说了可以使用 $this 来调用当前模块内的方法,但实际情况中还经常会在当前模块调用其他模块的方法.ThinkPHP 内 ...
- ASP.NET-服务器客户端的信息保持
ASP.NET客户端和服务器端的信息保持方案 来自为知笔记(Wiz)
- Apache Mahout 0.9、10.1、11. CardinalityException: Required cardinality 60 but got 29
我们可以使用Apache Mahout来快速创建高效扩展性又好的机器学习应用.Mahout结合了诸如H2O算法.Scala.Spark和Hadoop MapReduce等模块,为开发人员提供了一个 ...
- 自己定义控件-MultipleTextView(自己主动换行、自己主动补齐宽度的排列多个TextView)
一.功能: 1.传入一个 List<String> 数组,控件会自己主动加入TextView,一行显示不下会自己主动换行.而且把上一行末尾的空白通过拉伸而铺满. 2.配置灵活 <co ...
- Java程序命令行打包Jar
最近要跑爬虫程序,需要打包成jar发在linux服务器中运行.主要是第三方的lib包与配置文件,不进行打包,方便修改. 1.eclipse中src中源码编译后生成的源码在bin文件中,把里面源码单独拿 ...
- hdu Swipe Bo(bfs+状态压缩)错了多次的题
Swipe Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 《深入理解Android 卷III》第五章 深入理解Android输入系统
<深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...
- atitit。流程图的设计与制作 attilax 总结
atitit.流程图的设计与制作 attilax 总结 1. 流程图的规范1 2. 画图语言2 2.1. atitit.CSDN-markdown编辑器2 2.2. js-sequence-diagr ...