Unity的Camera组件有很多可调节的参数,当需要做优化的时候,stats面板中的tris和verts这两个重点项都与Camera组件的参数有很大关系,有些参数的意义Unity手册说得不够详细,经过我们的测试和咨询,把结论记下来,如果有不对欢迎留言~

Field Of View 这个值的范围从1-179,是一个角度,具体是哪个角呢,是从Camera自身坐标系x轴方向看过去的红色夹角,如图所示,在这个角度下摄像机的远近裁剪面与y轴平行

Clipping Planes 远近裁剪面,就是下图中梯形的下底和上底

接下来是本文的重点,请大家仔细阅读,我就一个常见问题,stats面板中显示的GPU渲染的面数tris及顶点数verts到底如何计算出来的?

这个问题之所以常见是因为影响Unity渲染效率或者游戏画面是否卡顿的最关键指标,就是stats面板中的tris和verts,搞清楚这两个指标的确切含义对于优化的意义不言而喻。

之前我一直以为这两个数据就是模型落在camera梯形中的顶点数,后来发现并不是这样,我把远裁剪面弄得与近裁剪面很接近,或者调整 field of view 都会改变这个梯形的体积,里面容纳的顶点看起来没有,但是stats面板里的数据确一直有。如下图,看起来这个梯形里没有顶点但是tris和verts的数据都显示GPU渲染出了那个矩形,12个tris(空场景本身有2个tris,剩下矩形6个4边面等于12个tris三角面)加24个verts(这个数字受多因素影响,不能从表现上解释):

camera 组件参数如下(注意field of view)

当我改变 field of view 到 120 以上时候,在game视图下我们就能看到那个cube了,换句话说,真正的结论就是:

Unity stats 视图中的 tris 和 verts 并不仅仅是视锥中的梯形的 tris 和 verts,而是 field of view 所有取值下的 tris 和 verts,换句话说,哪怕你在当前game视图中看不到这个 cube,如果当你把 field of view 调大到 179 过程中都看不到这个 cube,stats面板才不会统计,gpu才不会渲染,否则,都会渲染(见下图),而且unity不会把模型拆分,这个模型哪怕只有1个顶点需要渲染,unity也会把整个模型都渲出来。

 

Unity 模型优化中很常见的一个问题就是美术用max做出来的模型,在max里显示面数和顶点数少于unity中的,或者出现不一致的情况,根据我们的实际项目经历原因:

1)是max的数据显示的是四边面,而unity里status面板里的面tris是三角面,这两个的对应关系我根据数据总结是三角面的数量是四边面的2倍。

2)大家看一下这篇博主的文章 Unity 与 max 中顶点数面数区别的原因,其中提到的  Unity 这种将顶点一分为多的原因,主要有两个:一个是UV splits,一个是Smoothing splits。我们遇到的主要是 UV split,用通俗的语言解释就是UV 分割(max中用了几张UV网),比如一个人,他的UV分为头,身子两部分,一个车UV分为窗户,轱辘等等,UV分的越多,到Unity中的顶点数就会越多。所以最终的结果就是有的模型面多顶点少(如人物),有的模型面少顶点多(结构复杂的车),这也就解释了为什么max和Unity中模型的面数一般是一致的但是顶点数并没有直接的对应关系。

3)不同的制作方式对模型最终到Unity里也就是GPU的渲染下也会有不一样的结果,下面上一组图,三个不同颜色的加号,因为制作方式的不同导致了截然不同的渲染效率(而且这点往往和美术同学的认识相悖)

以下三个加号,绿的是两个box横竖穿插,红的是一个矩形挤压出横向矩形,黄的是一个竖box加左右两个横向box删掉横向box与纵向重叠的面,具体表现大家看数据吧~

  

Camera和 tris,verts的优化的更多相关文章

  1. Android--从系统Camera和Gallery获取图片优化

    前言 之前有两篇博客讲解了如何从系统内已有的Camera和Gallery应用中获取图片的例子,看到评论里有朋友说有时候会报错,导致程序崩溃的问题.本篇博客主要就这个问题分析讲解一下,最后将以一个简单的 ...

  2. [Unity优化]批处理01:Statistics窗口

    参考链接: https://docs.unity3d.com/Manual/RenderingStatistics.html unity版本:2018.3.8 新建一个场景,只保留Main Camer ...

  3. Unity 5 Stats窗口

    Unity5的 Statistics上的统计信息和Unity4 有一些区别, Statistics窗口,全称叫做 Rendering Statistics Window,即渲染统计窗口(或渲染数据统计 ...

  4. unity优化建议

    使用Profiler工具分析内存占用情况 System.ExecutableAndDlls:系统可执行程序和DLL,是只读的内存,用来执行所有的脚本和DLL引用.不同平台和不同硬件得到的值会不一样,可 ...

  5. Unity Optimization UNITY优化关注列表

    这里主要罗列Unity引擎进行开发的应用或游戏,可以进行优化的各个关注点.(此文会持续更新) C# GC alloc Update LateUpdate Serialize String ToStri ...

  6. Unity 性能优化(力荐)

    开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...

  7. Unity3d优化

    检测方式: 一,Unity3D 渲染统计窗口 Game视窗的Stats去查看渲染统计的信息: 1.FPS fps其实就是 frames per second,也就是每一秒游戏执行的帧数,这个数值越小, ...

  8. u3d 性能优化

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  9. 【Unity技巧】Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

随机推荐

  1. 线程安全 对StringBuilder抛出ArrayIndexOutOfBoundsException的探究

    对StringBuilder抛出ArrayIndexOutOfBoundsException的探究 - CSDN博客 https://blog.csdn.net/liu_005/article/det ...

  2. Record is locked by another user

    Oracle修改表中记录时出现record is locked by another user的问题 在操作表时没有commit,导致表被锁,只要执行下面两行语句,就可以了将行锁解锁了. Select ...

  3. ZeroMQ 初步认识

    http://www.danieleteti.it/zeromq-for-delphi/ https://my.oschina.net/zeroflamy/blog/109457 http://zer ...

  4. SpringMVC 之 Controller、Service层职责

    Controller层 1.接收httpRequest/requestDTO数据 ,检查接收数据参数与格式. 2.传递参数至Service层并接收返回responseDTO数据. 3.包装respon ...

  5. js获取三天后的日期

    js获取三天后的日期 setDate getNowAddTreeFormatDate() { var date = new Date(); date.setDate(date.getDate()+3) ...

  6. HDU 6122 今夕何夕 【数学公式】 (2017"百度之星"程序设计大赛 - 初赛(A))

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. Hadoop中序列化与Writable接口

    学习笔记,整理自<Hadoop权威指南 第3版> 一.序列化 序列化:序列化是将 内存 中的结构化数据 转化为 能在网络上传输 或 磁盘中进行永久保存的二进制流的过程:反序列化:序列化的逆 ...

  8. jsp重写url

    众所周知,使用java web编程出来的网站都是.jsp结尾的,而别人的网站都是以.html结尾的,那么这种效果是怎么实现的呢?就是这篇文章产生的原因,jsp重写url需要设计到第三方架包urlrew ...

  9. uuid.js

    // On creation of a UUID object, set it's initial valuefunction UUID(){    this.id = this.createUUID ...

  10. [Selenium] Actions.doubleClick

    WebElement el = page.getTable_AssetMixesName().get(index); Actions action = new Actions(driver); act ...