unity大场景优化.docx
《unity大场景优化.docx》由会员分享,可在线阅读,更多相关《unity大场景优化.docx(13页珍藏版)》请在冰豆网上搜索。
![unity大场景优化.docx](https://file1.bdocx.com/fileroot1/2023-1/29/166023f6-894e-4630-897f-9387f46df9c6/166023f6-894e-4630-897f-9387f46df9c61.gif)
unity大场景优化
首先介绍下drawcall(这个东西越少你的游戏跑的越快):
在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw
call),然后这个包传递到3D部分在屏幕上呈现出来。
这就和你希望你的亲友收到准备好的圣诞礼物需要
包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。
你的CPU来完成包装和传递他们的活,
同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。
目前,真正可怕的事情是从描绘指令消
耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:
他们
都消耗同样的描绘指令。
除此之外,没有什么更多的差别。
那么如何降低drawcall呢?
?
那么我们就用到Culling(剔除)技术。
如果不应用这个技术,电脑是不管
3721把场景里所有的东西都送去渲染的。
看得见的也渲染,看不见得照样也送去渲染。
很傻是吧,那咋办
呢。
得告诉电脑,那个你
看得见的渲染,看不见的就算了。
于是就有了
1.视锥体剔除(FrustumCulling)这个unity系统自带了好像,就不用操心了。
2.遮挡剔除(OcclusionCulling)
Unity3专业版内置了一个强大的OcclusionCulling插件Umbra免费的
遮挡剔除(OcclusionCulling)遮挡剔除是一种什么样的特性呢,当一个物体被其他物体遮挡住而不
在摄像机的可视范围内时不对其进行渲染。
.遮挡剔除在3D图形计算中并不是自动进行的。
因为在绝大多
数情况下离camera最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为
重复渲染,无效渲染"overdraw").遮挡剔除不同于视锥体剔除.视锥体剔除只是不渲染摄像机视角范围外的
物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内.注意当你使用遮挡剔除时你依然受
益于视锥体剔除(FrustumCulling).
左边的场景使用了遮挡剔除.右边的场景未使用遮挡剔除.
遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级.这
些数据可以让每个运行时间内的摄像机来确定什么能看见什么看不见。
通过这些数据,Unity将确定只把可
以看见的物体送去渲染.这将降低drawcalls的数量并提供游戏的运行效率.
occlusionculling的数据由单元(cells)组成.每个单元是整个场景范围数值的一部分.更多特定的单元来
自一个二叉树(binarytree).OcclusionCulling使用两个叉,一个给ViewCells(静态物体)另一个给
TargetCells(移动物体).ViewCellsmap给出了一个定义了静态可视物体的索引列表(精确剔除后的静
态物体).
非常重要的一点是在创建你的物体时要随时注意,因为你需要在物体的尺寸和单元的尺寸间取得一个好的
平衡.理想情况下,youshouldn'thavecellsthataretoosmallincomparisonwithyourobjectsbutequally
youshouldn'thaveobjectsthatcovermanycells.有时你可以通过将大的物体拆成几个部分来改进遮挡剔
除效果.无论如何你仍然能够将小的物体合并为一体来降低drawcalls,在它们都属于一些小的组件的时候,
occlusionculling将不起作用.确定组件中那个是可视的组件的选集和可视信息被认为是PVS(潜在可视状
态PotentiallyVisibleSet).
OcclusionCulling设置
为了使用遮挡剔除需要进行相关的手动设置.首先你关卡中的几何体必须被分割成明显的不同尺寸的块.
这也有助于布置关卡中小块的容易定义的区域被其他大物体遮挡(例如墙,建筑物)这意味着每个单独
的mesh被确定是否渲染取决于occlusion数据.所以如果你有一个物体包含了房间里的所有家具那么所
有的家具要么全渲染,要么全不渲染.是否渲染是基于组件而不是基于每个单独物体自身的。
在检视面板(Inspector)你需要标识(tag)所有需要应用遮挡剔除的场景物体。
最快的方法是是将你需
要标示为Static的物体作为一个EmptyGameObject的子物体并设置这个EmptyGameObject为Static,
当option出现的时候选择affectchildren.当子物体被taggedasStatic你可以取消子物体和Empty
GameObject的父子关系.
检视面板中的Staticcheckbox
下一步点击Tools->OcclusionCulling.打开OcclusionCulling检视面板,在面板中你会发现几个数值被
调整过了。
这些数值前面描述过:
-
OcclusionCulling-Object
遮挡剔除检视面板的object标签.
Object标签可以让你创建OcclusionAreasGameObjects.这些区域让你指定什么地方你会使用遮挡剔除.
注意:
默认情况下如果你不创建任何遮挡剔除区域,整个场景都会进行遮挡剔除.
Properties
QuickSelect
快速选择和创建一个OcclusionArea并且快速编辑它.
None
这个是默认值.
CreateNew
创建一个新的OcclusionAreaGameObject.
当你点击CreateNewintheQuickSelectdropdown,Unity将自动创建一个OcclusionArea并且删除默
认区域(整个场景).现在你可以根据需要开始调整OcclusionArea(s).
OcclusionArea检视面板.
Properties
Size
定义OcclusionArea的尺寸.
Center
选择OcclusionArea的中心.B默认为0,0,0并在box的中心位置.
IsViewVolume
定义摄像机的活动范围区域.点选这个选项才能应用遮挡剔除在OcclusionArea内的静态物体.
IsTargetVolume
如果你要遮挡剔除运动物体,打开这个选项.
TargetResolution
确定区域内的OcclusionCulling精度.即一个OcclusionArea的单元尺寸.注意:
这个选项只对Target
Areas(移动物体)起作用.
Low
减少计算时间但同时精度降低.
Medium
计算时间和精度中等,比较平均.
High
计算时间长但精度高.
VeryHigh
精度很高,计算时间更长.
ExtremelyHigh
最高精度.注意:
计算时间令人发指。
如果摄像机处于遮挡区域之外或者任何物体超出区域,这些物体将不会被遮挡剔除.
OcclusionCulling-Bake
Occlusionculling检视面板baketab.
Properties
ViewCellSize
每个viewarea单元的尺寸,尺寸越小遮挡剔除越精确.这个数值用来平衡遮挡剔除的精度和存储容量
NearClipPlane
Nearclipplane如果设置最小数值那么游戏中所有摄像机都可看到.
FarClipPlane
FarClipPlane用于选择objects.任何物体的距离大于这个设定数值都会被自动遮挡.(Shouldbesetto
thelargestfarclipplanedthatwillbeusedinthegameofallthecameras)
Quality
品质级别
Preview
开发阶段使用这个(ie,不是很准确但可以让你御览在游戏中的大致表现)
Production
如果开发基本结束准备发布那就该选择这个(会耗费更多的时间但更精确)
当你调整完这些数值后可以点击Bake按钮开始处理OcclusionCulling数据.如果你对结果不太满意,你可
以点击Clear按钮删除以前的计算数据.
OcclusionCulling-Visualization
Occlusionculling检视面板visualization可视标签
Properties
QuickSelect
让你快速选择场景中的任何摄像机来观看遮挡剔除的效果
Thenearandfarplanes定义了一个虚拟摄像机来计算遮挡剔除数据.如果你有几个摄像机near或far
planes不同,你应该设置nearplane和largestfarplanedistance适配所有摄像机来调整物体的包括范围.
所有场景里的物体只在数值范围内起作用所有请确定你的所有物体都处于可视范围.
当你准备好生成occlusiondata,点击Bake按钮.记住在Bake标签的Qualityselectionbox中事先选择
Preview和Production.Preview可以快速生成数据并可以快速检查结果.Production用于产品发布前的
生成和检测.
请记住遮挡剔除的数据计算生成速度取决于事先设置的celllevels(单元级别),数据尺寸大小和精度.
Unity会在窗口底部显示PVS运算状态.
运算处理结束后,你会在ViewArea看到一些不同颜色的cube.颜色相同的区域共享遮挡剔除数据.
点击Clear如果你想删除所有遮挡剔除的事先计算好的数据(预计算数据).
MovingObjects
如果想应用遮挡剔除到一个运动物体你必须创建一个OcclusionArea然后设定其尺寸来适配运动物体的活
动空间(注意:
运动物体不能被标示为static).
创建OcclusionArea后,检查IsTargetVolumecheckbox来遮挡剔除运动物体.
移动物体的OcclusionAreaproperties
Size
设定OcclusionArea尺寸.
Center
设定OcclusionArea的中心.默认0,0,0并位于box的中心.
IsViewVolume
定义摄像机能到哪里.检查这个数值来遮挡剔除OcclusionArea中的staticobjects.
IsTargetVolume
遮挡剔除运动物体时必选
TargetResolution
确定区域内的遮挡剔除精度。
这将决定OcclusionArea的单元尺寸.注意:
只对TargetAreas起作用.
Low
减少计算时间但同时精度降低.
Medium
计算时间和精度中等,比较平均.
High
计算时间长但精度高.
VeryHigh
精度很高,计算时间更长.
ExtremelyHigh
最高精度.注意:
计算时间令人发指。
添加完OcclusionArea后,你需要了解它是如何划分单元中的box.如果想了解occlusionarea如何计算运
动物体,你必须在SceneView中点选Target按钮并且关闭View按钮同时OcclusionCulling检视面板
是打开的.
SelectingTarget(movingobjects)orView(staticobjects)让你御览calculateddata的运作.
Testingthegeneratedocclusion
occlusion设置完毕后,打开CullGeometryoption(intheOcclusionCullingwindow)并在场景视窗移动
MainCamera.
iSceneView中的OcclusionViewmode
当你在周围移动MainCamera(无论是否在Playmode下),你将会看到不同的物体disable.你在这里需
要找出的是occlusiondata中的任何错误.当你移动摄像机时你可能会发现会有物体突然出现在视野当中.
如果这种情况发生,youroptionsforfixingtheerrorareeithertochangetheresolution(ifyouareplaying
withtargetvolumes),ortomoveobjectsaroundtocoveruptheerror.Todebugproblemswithocclusion,
youcanmovetheMainCameratotheproblematicpositionforspot-checking.
运算处理结束后,你会在ViewArea看到一些不同颜色的cube.蓝色cubes表现的是TargetVolumes的单
元划分.白色cubes表现的是ViewVolumes的单元划分.如果参数设置正确你会看到一些物体不被渲染.
这表示要么这些物体不在摄像机视角范围内要么被其他物体遮挡住了.
如果occlusion完成后,场景内任何物体也没有被遮挡,拆分物体至更小的pieces以便它们能被完整地包含
在一个单元中.
要提醒朋友们的是,如果场景复杂,品质设置高的话,烘焙过程将漫长的令人发指。
赶紧升级电脑吧!
!
!
对于没有买专业版并无法使用umbra插件的朋友也不必担心,还有另外一个Culling剔除插件可以选择,
是完全免费共享的。
具体名字忘记了,不过去unity网站的讨论版搜一下Culling关键词可以很容易找见。
就
到这里.就到这里.转自:
LOD(Level-of-detail)是最常用的游戏优化技术。
如果你的程序可以定制开发应用LOD的模块,当然
是很美好的事情。
不过如果没有也没关系,大家可以使用UniLOD这个第三方的LOD插件。
免费共享的哦
(向UniLOD开发者致敬,赞美伟大的共享精神!
!
!
)
以下是简介:
功能众多,涉及到场景管理,模型优化,资源管理员,及显示效果变化,且不需要脚本编写,全部通过编
辑器实现!
目前此unity3d扩展为开源的,你可以下载到源代码来研究学习。
特色:
·1.自动简化网格体(Windows+UnityProonly)
根据用户的设定自动减面。
·2.Level-of-detail编辑器
方便快捷的创建LOD组件来切换不同的品质级别或通过设定距离数值来显示
或隐藏物体。
创建你的LOD场景
方便快捷的用LOD组件来替换现有组件将现有的场景转换为拥有LOD管理的
场景。
将单个的mesh和贴图成组来降低drawcalls
将场景存储为标准assets或者asset包
·3.场景管理
Streaming支持
Streamyoursceneastheplayermovesthroughtheworld
资源自动loaded/unloaded
Streamfromresourcefolder,orassetbundles
Minimalperformanceimpactwithresourcebuffering
可以根据需要调整,速度或者内存
Takescareofswitchingqualitylevelsastheplayermovesthoughthe
world
充分优化,使用最少的资源
·4.资源管理
所有assetbundles和普通资源都以标准方式载入。
Keepsreferencecountsonyourresourcesand自动释放
·5.完整植入Unity并只需要通过UnityEditorAPI来操作。
无需输入代码
Sorry,场景管理和资源管理的有些内容没搞懂就不乱翻译了。
链接:
扩展beta版本发布
unilod-beta-levelofdetail-and-streaming-support
当然,Unity3d自己的地形是自带LOD功能的,当你刷好你的地形后,你只需要调整PixelError这个
参数即可。
Unity3d会自动计算生成地形的LOD,无需你做其他的任何设置。
要提醒朋友们的是,如果你使用了Lightmap,那么同时使用LOD的时候会有一些麻烦,我们的办法
是制作模型的时候事先做好第二套uv(不使用Unity的自动计算lightmapUV功能),而且所有LOD的第
二套UV的分布位置都一致,很费工。
不知道有没有更好的方法!
!
!
转自:
动态实时灯光相比静态灯光,非常耗费资源。
所以除了能动的角色和物体
(比如可以被打的到处乱飞的油桶)静态的地形和建筑,通通使用Lightmap。
强大的Unity内置了一个强大的光照图烘焙工具
Beast,这个东东是Autodesk公司的产品(可怕的垄断,感觉和3d沾边
的软件丫都要插一手)。
据说用来制作过杀戮地带和镜之边缘。
镜之边缘建筑场景漂亮干净的光影,Lightmap的效果。
在Unity中制作Lightmap很方便,调节几个参数后直接烘焙即可。
支持
GI,Skylight,
效果一流!
!
!
当然你需要一台好点的机器,不然漫长的烘焙过程你就有
的等了。
内置的光照图烘焙工具Beast
P场景准备和光照图烘焙
点选Window-->Lightmapping打开光照图烘焙面板:
1.确认所有将要被用来烘焙光照贴图的网格体UVs正确无误.最简单的办法是在meshimport
settings中选择GenerateLightmapUVs选项(由Beast自动分uv)
2.在Object面板中将所有网格体或地形标注为static–这将告诉Unity,这些物体将不会被移动和
改变并且可以被赋予光照贴图。
3.为了控制光照贴图的精度,进入Bake面板并调整Resolution的值.(为了更好的了解你的
lightmaptexels使用情况,在在Scene视视窗中找到到LightmapDisplay小窗口并且选择Show
Resolution).
1.点击Bake按钮。
2.UnityEditor's会出现一个进度条,位置处于右下角.
3.当烘焙结束,LightmapEditor窗口会显示已经烘焙好的光照图.
Scene和game视图会同时自动更新–现在你的场景已经有了光照图的效果!
UnityLightmap的设置还有更详细和更高端的内容,请参考自带的文档,那才
是王道啊!
!
!
!
!
最近制作的一个野外场景快完工了。
阿弥托福!
!
!
!
希望能跑的流畅,千万别
返工啊!
!
!
为了避免出现杯具,提前研究了一些资料,涉及到Lod技术(LevelsofDetail,
多细节层次),
选择剔除(Culling
),
光照贴图(Lightmap)当然还有强大而又脆弱的Unity3d引擎.
所有资料都来自互联网和Unity自带的文档。
有些文档我自己业余时间翻译了下,
错误的地方请朋友们指正。