最近连续遇到了几个绘制图像之間相互遮挡关系不正确的问题网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来
Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层可以在Camera的depth那里设置,设置之后图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体也僦是说,depth高的相机会覆盖depth低的相机(具体的覆盖关系有don’t clear solid color等等几种)
简单总结一下,决定Unity渲染关系的层级顺序是:
在最近使用U3D开发的遊戏核心部分功能即将完成,中间由于各种历史原因导致项目存在比较大的问题,这些问题在最后恐怕只能通过一次彻底的重构来解決
现在的游戏跑起来会有接近130-170个左右的DrawCall,游戏运行起来明显感觉到卡而经过一天的优化,DrawCall成功缩减到30-70个这个效果是非常显著的,并且這个优化并没有通过将现有的资源打包图集来实现图集都是原有的图集,如果从全局的角度对图集再进行一次优化那么DrawCall还可以再减少┿几个
本次优化的重点包括:层级关系和特效
对于U3D,我是一个菜鸟对于U3D的一些东西是一知半解,例如DrawCall我得到的是一些并不完全正确的信息,例如将N个纹理打包成一个图集这个图集就只会产生一个DrawCall,如果不打成图集那么就会有N个DrawCall,这个观点在很多人的认识里都是正确嘚因为可以通过简单的操作来验证,但严格来说这个观点是错误的,因为它还受层级关系影响!
U3D的渲染是有顺序的U3D的渲染顺序是由峩们控制的,控制好U3D的渲染顺序你才能控制好DrawCall
一个DrawCall,表示U3D使用这个材质/纹理来进行一次渲染,那么这次渲染假设有3个对象那么当3个對象都使用这一个材质/纹理的时候,就会产生一次DrawCall可以理解为一次将纹理输送到屏幕上的过程,(实际上引擎大多会使用如双缓冲缓存这类的手段来优化这个过程,但在这里我们只需要这样子认识就可以了)假设3个对象使用不同的材质/纹理,那么无疑会产生3个DrawCall
接下来峩们的3个对象使用2个材质A和B使用材质1,C使用材质2这时候来看,应该是有2个DrawCall或者3个DrawCall。应该是2个DrawCall啊为什么会有3个DrawCall??而且是有时候2個有时候3个。我们按照上面的DrawCall分析流程来分析一下:
1.渲染A使用材质1
2.渲染B,使用材质1
3.渲染C使用材质2
在这种情况下是2个DrawCall,在下面这种情況下则是3个DrawCall
1.渲染A,使用材质1
2.渲染C使用材质2
3.渲染B,使用材质1
因为我们没有控制好渲染顺序(或者说没有去特意控制)所以导致了额外嘚DrawCall,因为A和B不是一次性渲染完的而是被C打断了,所以导致材质1被分为两次渲染
那么是什么在控制这个渲染顺序呢首先在多个相机的情況下,U3D会根据相机的深度3D资料顺序进行渲染在每个相机中,它会根据你距离相机的距离由远到近进行渲染,在UI相机中还会根据你UI对潒的深度3D资料进行渲染
那么我们要做的就是,对要渲染的对象进行一次规划正确地排列好它们,规则是按照Z轴或者深度3D资料,对空间進行划分然后确定好每个对象的Z轴和深度3D资料,让使用同一个材质的东西尽量保持在这个空间内,不要让其他材质的对象进入这个空間否则就会打断这个空间的渲染顺序
在这个基础上,更细的规则有:
每个材质/纹理的渲染一定是会产生DrawCall的这个DrawCall只能通过打包图集来进行优化
制作图集一般遵循几个规则:
字符图集在使用BMFont或者其他工具生成图片字的时候,我们往往是直接导入┅大串文字然后直接生成图片,但实际上这上面的操作也有优化空间例如BMFont生成的图片大小,是可以设置的有两个规则,一个规则是導出的图片尽量小另一个是导出的图片尽量少,默认的大小应该是512×512假设你生成的图片256×256就可以容纳,那么多做一个操作你可以节省這么多空间另外当你输入多几个字,就导致增加一张图片时例如1024变成2048,那么你可以考虑使用3张512的图片这样也会节省空间
经过精心划汾的图集在加上精心规划的渲染顺序,DrawCall会有一个质的优化
U3D提供了非常便捷的方法让我们很轻易地使用美术给过来的特效懒惰的U3D程序猿会矗接放入U3D,甚至不去看这是个什么特效我们的特效一般都是一瞬间的事情,例如技能特效或者其他什么特效,那么特效播放完这个特效我们就看不到了,但假设这个特效在播放结束的时候没有将自身的Active属性设置为false,那么它就会继续占用你的DrawCall消耗你设备的计算能力,所以程序需要保证当一个特效播放完之后能够被消耗,或者设置为非激活的状态可以使用一些公共方法来完成特效播放完之后的清悝工作(自己实现2个静态函数,一个播放完销毁一个播放完设置未激活)
完成DrawCall的优化之后,接下来就是内存的优化了(内存优化手记 待续)
传感技术的最新进展使人们有可能轻松地拍摄彩色和深度3D资料信息并存的图
片以提高物体识别的图像。目前大多数方法对于这个新的
常精心设计的特征。引入一个基於卷积和递归神经网络(
层用于学习低水平的平移不变性的特
征然后作为多个固定树
的输入,以组成高阶特征
卷积,并汇集到一个高效的、分层的操作我们的主要结果是,甚至随机权重的
对象集上获得了较好的艺术
表现力与其他可比的架构相比(如两层
,在训练和測试的阶段能更准确、
物体识别是计算机视觉中最困难的问题之一并对于实用化家庭环境下的机
器人十分重要。新的传感技术(如
)信息并且现在已经结合标准视觉系统在家用机器人中运用了。深度3D资料
模式为复杂问题的总体目标检测提供有用的额外信息
由于深度3D资料信息是不随亮度
或颜色的变化而变化的,
并提供了几何线索使得可以更好地从背景中分离
图像的物体识别使用手工设计的特征集,如②维图像的
或特定的颜色,形状和几何特征
本文介绍了用于对象识别的第一卷积递归深度3D资料学习模型该模型可以借鉴原
,我们的做法具有更快速
度、不需要额外的输入渠道(如表面法线)
、艺术性地检测家用物品的特点图
列出了我们的做法。训练和测试代码在
和深喥3D资料图像进行分析并首次分别从中提取特征。每一
种模式首先输入一个卷积神经网络层(
这个网络层提供了低层特征
并且允许对象茬一定程度上变形。
器相应随后传送给一个递归神经网络(
它可以学习成分特征和部分
通过绑定权重和非线性的多个层次,
分层地投入箌低维空间中
本文也探索了计算机视觉中新的深度3D资料学习架构。之前
本文Renderbus云渲染农场将继续带您从场景内部灯光、用料、反射、材质等方面的优化提升场景渲染的速度。
每个发光器无论是发光材质的物体还是实际的发光物体,都会向場景添加更多必须在渲染时进行追踪的光线
尤其是在您可能会在大多数场景中使用的“全局照明”中,每种光线都会产生在场景周围反彈几次的光线–而这些光线中的每一种都必须由GPU或CPU计算
在某些情况下,添加光源可以加快渲染速度:如果您使用的是GI并且图像中有很哆暗区域,而这些区域都不容易直射光线那么添加另一个(非常暗)的光可以使这些区域变亮。快速清除那些嘈杂的像素
添加灯光以便直接照亮您的主体,可以使渲染速度非常快只有在必须几次左右反射才能达到目标时,或者如果它们本身具有更复杂的性质时灯光財会真正变慢。
例如区域光在计算上是昂贵的,因为光线跟踪器必须采样很多光线才能覆盖区域光的整个区域所以还要确保生成的阴影很柔和。
与点光源相比面光源是主要的减速器——尤其是大面积照明时。
尽可能尝试使用门禁灯尤其是在照亮通过窗户照亮的室内場景时。门户照明比区域照明更高效并且渲染速度更快。
尽可能使用聚光灯和非光线跟踪的阴影贴图柔和阴影。使用这些可以更快地計算出软阴影并且可以在不改变场景外观的情况下极大地加快渲染时间。
使用HDRI或天体在室外照明中渲染场景由于您从一个完整(或一半)的圆顶获得均匀的照明,因此Sun的速度通常非常快这意味着您的光线不必为了反射一切而进行大量反射。
如果您的3D软件和渲染引擎具囿限制灯光反弹和灯光范围的功能请这样做。让您的场景主体受到非常远的光线的影响或者被其他光线阻挡/很难到达的光线是没有意義的。
必须多次反射才能到达场景主体的光线所发出的光线或者已经衰减到几乎不可见的光线可能会在渲染中引入大量噪点。
有时您鈳以只使用“渲染”或“项目标签”来限制灯光应照亮的水平以清除噪音,来排除任何不必要的内容。
有很多“材质特征”可以减慢渲染速喥毕竟,“材质”构成了场景的整个“表面”区域
照明可以与场景材质进行交互的三种基本方式。光可以是:
部分被吸收分散和反射(例如皮肤)
还记得我们所说的保持场景中尽可能少的光线和光线反弹以更快地渲染吗?材料是成倍增加必须计算的射线数量的主要因素
任何Material属性会增加场景中的光线数量或需要清除许多样本,这会使渲染速度变慢
让我们看一些主要的罪魁祸首:
让光线从铬球反射(硬反射)是您在3D中最简单的操作。
这是一个带有硬反射的Chrome Ball并排显示并且需要分配样本来清除图像中的噪点(白色=更多样本,黑暗=更少样夲):
拿这个镀铬的球并使反射变柔和(有光泽)您将创建大量必须计算的新射线。现在根据反射的柔和度,入射光线会在各个方向仩均匀散射
渲染引擎必须计算的采样和光线越多,完成渲染所需的时间就越长
这同样适用于光泽折射。光滑的反射和光滑的折射的结匼将进一步增加渲染时间
现在,我并不是说不要使用光滑的折射或反射-它们是大多数材料的组成部分但是当您使用它们时,请确保尽鈳能优化它们
以下是优化折射和反射的方法:
限制其射线反弹(跟踪深度3D资料)
当您的反射或折射是光滑的(模糊的)时,您实际上无法在反射或折射中辨别出细节我们可以利用它来发挥我们的优势。
由于材质中的反射/折射场景非常模糊因此我们无法判断反射/折射场景是否100%准确,这意味着我们可以降低折射/反射场景的复杂性,而无需任何人注意
通过限制走线深度3D资料,我们告诉特定的光泽材料仅反射或折射其他对象而不反射那些对象自己的反射或折射(达到一定数量的深度3D资料/反射)。
这意味着我们可以节省很多射线因为我们囚为地限制了跟踪深度3D资料。我们可以在大多数渲染引擎中执行此操作或者直接在材质设置中执行此操作,或者有时您需要将渲染标签應用于某些对象才能使用此功能
这是Redshift渲染引擎中的外观:
我们在上图中看到的另一个优化是“截止阈值”-基本上,这是告诉渲染器仅考慮会改变像素外观的光线而不是定义的阈值。
看起来合乎逻辑不是吗?
它仅应在对渲染产生明显影响的东西上使用计算资源
问题是,默认情况下这些阈值是如此之低,以至于它们根本不会影响您的渲染时间您必须增加阈值才能充分利用它。试一试看看有什么区別。使用这些可以加快光泽反射和折射
当然,您也可以在硬反射或折射上使用它们但是由于在硬反射中一切都非常清晰,因此您可能會注意到截止点发生得更快
还记得光泽反射如何增加材料产生的射线数量以及清除噪声所需的样本数量吗?
茬这方面使用凹凸贴图,法线贴图或位移贴图非常相似由于这些贴图试图伪造网格细节,因此入射光线也被它们散射
细节越精细,產生的光线越多即使您的网格只有几个多边形(即一个多维数据集),如果您在其顶部有一个复杂的凹凸贴图该凹凸贴图会将光线散射到整个位置,则渲染速度将大大降低
如果不使用一些出色的位图/纹理,几乎无法创建3D场景它们会为您的网格物体添加细节,以至于夶多数情况下要进行建模会花费太多时间
确保您的纹理分辨率不会过度使用它。在整个场景中拥有一堆8k纹理即使2k或1k纹理就足够了(考慮到对象的屏幕尺寸),渲染引擎也很难在整个场景中工作