VR性能调优,工具介绍与原理分析
2016-12-02 | 默认 | 偷偷
在同等硬件条件下,优化使用体验只能从软件调优出发,而调优的第一步是时刻了解各种维度的性能数据,所以先介绍相关性能数据采集工具的使用方法。
2016年VR很火热的一年,但目前VR设备正处于各种探索阶段,厂商们尝试着各种类型的头戴显示设备和输入设备,VR内容也在游戏、教育、医疗等范围逐渐试水。高清无延迟的要求对硬件提出了新的挑战。在同等硬件条件下,优化使用体验只能从软件调优出发,而调优的第一步是时刻了解各种维度的性能数据,所以先介绍相关性能数据采集工具的使用方法。
其次,在一款好的UnityVR产品中,吸引人的很可能是各种造型独特的角色外形,还有夸张神奇的光影效果,让人们体验到现实生活中无法感受的逼真反馈。但是大量高精细的模型和多层次的光影效果又是影响性能的主要元凶。具体这些模型和效果如何影响性能,本文第二部分从原理上进行分析和诠释,最后给出优化建议。
另外,VR程序的优化不仅仅是程序猿的工作,更多是美工同学的特效实现,以及产品对游戏设计的把控。
一、工具介绍篇
Unity作为一款收费软件,除了开发过程中IDE提供的便捷,在性能分析能力上也有拿得出手的地方。Unity提供了三个不同维度的性能分析工具,从使用的便捷程度看,依次是Statistics(渲染统计窗口)、Profiler(性能分析器)和FrameDebug(帧调试器)。下面将逐个介绍使用方法和对应的数据解释。
1、小而美的渲染统计窗口Statistics
Statistics在操作上最简便,在Game主窗口中(Ctrl+2),点击右上角的Stats按钮即可打开一个固定浮窗,在项目运行过程中,始终显示一组固定维度的数据,这是几个最具总结性的数据,能给出性能大致的档次
其中图像性能部分的数据含义如下:
个人认为下面4个数据最能说明问题:
1) FPS说明了实际用户感受的流畅度。
2) Saved by batching说明了实际节约了CPU调用的次数。
3) Tris 和Verts 则如实的告知了GPU的工作量有多大。
2、可定制维度的调试器Profiler
Profiler基于时间流记录信息。提供切换开关,能够任意查看cpu、gpu、渲染、内存、音频、physics等分析项在30秒内采集的数据。对于有些项还可以观察子项目。下面是总体效果图,具体细节逐个图分解道来。
1)开始获取数据与时间轴查看
点击顶部的导航按钮中的record准备随时采集数据,如果此时把程序run起来,就可以立刻看到数据进来。性能数据从右向左在时间轴上推进。选择任何一个片段可以查看细分数据。通过两个尖角按钮查看前后帧的性能数据。
2)关闭和增加不同的分析器
在分析性能时可以聚焦于某类数据(比如CPU和内存),直接点击分析器的关闭按钮即可。想要找回关闭的分析器从顶部菜单选择add Profiler即可。
3)子项目的屏蔽和开启,以及排序
对于CPU分析器和GPU分析器都有很多子统计分组,这些分组的数据可以屏蔽掉不显示,也能拖动后改变右侧的时间堆叠排序。
4)CPU分析的时间轴模式
CPU分析器下面有几种视图可以切换,Timeline时间线模式可以看到具体消耗的先后关系以及时间占比。
5)GPU分析器
GPU分析器类似于CPU分析器,在底部面板作为层级显示渲染时间的细节。从层级选择的项目会显示在右边的面板细分。
6)渲染分析器
渲染分析器下面显示了主要的统计数据,这些和渲染统计窗口的数据一致。
7)内存分析器
内存分析器有两种视图,一种是内存统计值,一种是详细分类。对于统计模式有下面一些项目:
在Detailed模式下,选择take sample:Editer能够显示游戏中任何对象和资源在内存中的详细使用情况。
8)物理分析器
物理分析器主要统计了场景中的刚体和碰撞体相关信息。刚体是需要进行重力计算的物体,碰撞体则时刻要侦测物体是否产生交集,都是计算量大户。
3、再谈帧调试器Frame Debug
Frame Debug也即帧调试器,可以让你看到一帧中渲染的步骤分解。按时间顺序从空白画面到画面完成中每一步的渲染事件。左侧渲染事件列表,点击一个渲染事件可以在右侧看到渲染完成效果,结合渲染统计面板,可以查看这个渲染完成时的统计数据。
这个工具可能更适合项目中3D场景美工调优,通过这个工具可以得出时间主要花在哪些元素上。
4、Profiler的使用技巧
在前面的Profiler中,使用deep profile可以在你的工程中自动进行全面的分析,但是耗时可能很久,甚至Unity因此而崩溃。改用下面的方法可以对具体代码段的耗时分析。通常是工程中新加入的代码模块,比较适合定点调优。
1) 第一步,确定需要分析的代码
2) 第二步,在代码区块前后加上开关(参考如下)
3) 第三部,运行项目,查看代码块的时间消耗
注意上面的代码是匹配的一对。一个Begin,一个End。包裹着你想查看性能数据的代码段。下图中标示出来的就是定点分析的代码块的时间消耗。
5、我们的BigProfiler工具
前面看到Unity的profiler工具只能统计30帧内的性能数据,多少有些遗憾。为了改进这个问题,专项同学经过深入分析后,开发了定制的profiler工具BigProfiler,可以统计超过30秒的性能数据,还可以导出数据进行外部的二次处理。
二、Unity渲染原理篇
计算机完成动画的每一帧都涉及到CPU、GPU、内存,显存、驱动程序的协同调用。从总体上可以使用下图说明它们之间的关系:
其中OpenGL和DirectX是GPU的编程接口。应用程序通过接口操作GPU。而这些接口进一步调用具体显卡厂商的驱动程序来真正操作GPU。
概括来说,我们的应用程序运行在CPU上,通过调用OpenGL的图形接口将渲染所需的数据(顶点数据,纹理数据,材质参数)存储在显存中的特定区域,之后,开发者通过图像编程接口发出渲染命令(如OpenGL中的glDrawElements或者DirectX中的DrawIndexedPrimitive),也就是Draw Call。它们将会被显卡驱动翻译成GPU可以理解的代码,进行真正的绘制。
GPU拿到数据进行绘制在内部是流水线操作的。应用程序中的原始数据正是经过GPU的渲染绘图流水线之后,输出一帧确定的2D图片的。
具体每个流水线的内部主要分为下面几个步骤:
顶点处理,主要是通过一系列的坐标系转换,将模型的顶点在摄像机前进行位移,并最终投影到摄像机的投影屏幕上的过程。这里对应的主要工作量可以用前面的渲染统计面板的Tris(顶点数)来衡量。
面处理,经过前面的顶点数据,得到初步的三角面,进一步把被遮挡住的面进行删除或者裁剪。这个主要对应Verts(三角面)。
光栅化,将以向量为基本结构的面转换成一个个点阵式的像素。其中有个环节叫做三角形遍历。这时候得到的结果是一个片元序列,一个片元并不是真正意义上的像素,而是包含了很多状态的集合。这些状态用于计算每个像素的最终颜色。这些状态包括(不限于)屏幕坐标、深度信息、以及其他几何阶段输出的顶点信息,如法线,纹理坐标等。
像素处理,根据片元信息集合,进行一些运算(比如模板测试、深度测试、混合)得到具体像素的颜色值和透明度。对于图像中使用了透明效果的地方会使用混合操作。所以大量使用半透明效果将增加这一步的运算时间。
性能优化策略
最后,在经过多本相关书籍整体后,对于Unity的性能优化主要有下面的建议:
相关阅读
更多...-
谷歌发布专利旨在改变房间规模VR体验
2019-02-14|841 -
观界科技助力台北跨年晚会直播 VR全景直播让全球华人大呼过瘾
2019-02-14|799 -
AR核心技术正在向SLAM发展
2018-08-10|3647 -
Sketchbox推出AR/VR开发工具,无需代码即可创作
2018-02-11|3154 -
如何判断你的电脑是否兼容VR?
2017-12-29|1502 -
不会编辑VR视频 这里有份简单的入门指南
2017-12-26|1705 -
TPCAST、Amimon以及DisplayLink,VR无线传输大起底
2017-12-13|1438 -
Magic Leap顾问研发新AR显示原型,可让虚实物体互相遮挡
2017-12-06|1394 -
智能AR/AI结合的购物体验离我们还有多远?
2017-11-29|3329 -
你真的了解 360 度全景相机和 VR 之间的区别吗?
2017-11-22|1256