Unity3d游戏场景优化杂谈

2019-04-14 17:31发布

提前研究了一些资料,涉及到Lod技术 (Levels of Detail,多细节层次), 选择剔除(Culling),光照贴图(Lightmap)当然还有强大而又脆弱的Unity3d引擎. 所有资料都来自互联网和Unity自带的文档。
http://blog.sina.com.cn/s/blog_409cc4b00100no8y.html 动态实时灯光相比静态灯光,非常耗费资源。所以除了能动的角 {MOD}和物体(比如可以被打的到处乱飞的油桶)静态的地形和建筑,通通使用Lightmap。 强大的Unity内置了一个强大的光照图烘焙工具Beast这个东东是Autodesk公司的产品(可怕的垄断,感觉和3d沾边的软件丫都要插一手Unity3d游戏场景优化杂谈(2))。据说用来制作过杀戮地带镜之边缘 Unity3d游戏场景优化杂谈(2)
       镜之边缘建筑场景漂亮干净的光影,Lightmap的效果。
在Unity中制作Lightmap很方便,调节几个参数后直接烘焙即可。支持GI,Skylight, 效果一流!!!当然你需要一台好点的机器,不然漫长的烘焙过程你就有的等了。     内置的光照图烘焙工具Beast 

P场景准备和光照图烘焙

点选 Window --> Lightmapping 打开光照图烘焙面板: 1.     确认所有将要被用来烘焙光照贴图的网格体 UVs正确无误. 最简单的办法是在mesh import settings中选择 Generate Lightmap UVs选项(Beast自动分uv 2.在Object面板中将所有网格体或地形标注为 static  这将告诉 Unity, 这些物体将不会被移动和改变并且可以被赋予光照贴图。
Unity3d游戏场景优化杂谈(2) 
3.为了控制光照贴图的精度, 进入 Bake 面板 并调整Resolution 的值. (为了更好的了解你的 lightmap texels使用情况Scene视窗中找到 Lightmap Display 小窗口并且选择 Show Resolution).

 

Unity3d游戏场景优化杂谈(2) 

1.     点击 Bake 按钮。 2.     Unity Editor's 会出现一个进度条,位置处于右下角. 3.     当烘焙结束, Lightmap Editor窗口会显示已经烘焙好的光照图. Scene  game 视图会同时自动更新  现在你的场景已经有了光照图的效果! Unity Lightmap的设置还有更详细和更高端的内容,请参考自带的文档,那才是王道啊!!!!!
http://blog.sina.com.cn/s/blog_409cc4b00100o6qu.html
LOD(Level-of-detail)是最常用的游戏优化技术 。如果你的程序可以定制开发应用LOD的模块,当然 是很美好的事情。不过如果没有也没关系,大家可以使用UniLOD这个第三方的LOD插件。免费共享的哦(向UniLOD开发者致敬,赞美伟大的共享精神!!!) Unity3d游戏场景优化杂谈(3)

以下是简介: 功能众多,涉及到场景管理,模型优化,资源管理员,及显示效果变化,且不需要脚本编写,全部通过编辑器实现!目前此unity3d扩展为开源的,你可以下载到源代码来研究学习。 特 {MOD}: ·1.自动简化网格体(Windows + Unity Pro only)                      根据用户的设定自动减面。 · 2.Level-of-detail 编辑器                      方便快捷的创建LOD组件来切换不同的品质级别或通过设定距离数值来显示                      或隐藏物体。                       创建你的 LOD 场景                       方便快捷的用 LOD 组件来替换现有组件将现有的场景转换为拥有LOD管理的场景。                        将单个的mesh和贴图成组来降低draw calls                        将场景存储为 标准 assets 或者 asset 包 ·  3.场景管理                         Streaming 支持                          Stream your scene as the player moves through the world                           资源自动 loaded/unloaded                           Stream from resource folder, or asset bundles                            Minimal performance impact with resource buffering                           可以根据需要调整, 速度或者内存                           Takes care of switching quality levels as the player moves though the world                           充分优化, 使用最少的资源 ·   4.资源管理                            所有asset bundles 和普通资源都以标准方式载入。                            Keeps reference counts on your resources and 自动释放 ·   5.完整植入 Unity 并只需要通过UnityEditor API来操作。                           无需输入代码 Sorry,场景管理和资源管理的有些内容没搞懂就不乱翻译了。 链接: http://unity3d8.com/content/lod扩展beta版本发布unilod-beta-levelofdetail-and-streaming-support   当然,Unity3d自己的地形带LOD功能的,当你刷好你的地形后,你只需要调整Pixel Error这个 参数即可。Unity3d会自动计算生成地形的LOD,无需你做其他的任何设置。 Unity3d游戏场景优化杂谈(3)
要提醒朋友们的是,如果你使用了Lightmap,那么同时使用LOD的时候会有一些麻烦,我们的办法 是制作模型的时候事先做好第二套uv(不使用Unity的自动计算lightmapUV功能),而且所有LOD的第二套UV的分布位置都一致,很费工。不知道有没有更好的方法!!!
http://blog.sina.com.cn/s/blog_409cc4b00100oivo.html
首先介绍下draw call(这个东西越少你的游戏跑的越快):

在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为描绘指令draw call,然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角 {MOD}或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。

那么如何降低 draw call 呢??那么我们就用到Culling(剔除)技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你 看得见的渲染,看不见的就算了。于是就有了 1.视锥体剔除Frustum Culling这个unity系统自带了好像,就不用操心了。 2.遮挡剔除Occlusion Culling

Unity 3专业版内置了一个强大的 Occlusion Culling 插件 Umbra免费的

遮挡剔除(Occlusion Culling   

遮挡剔除是一种什么样的特性呢, 当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。. 遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染,无效渲染"overdraw"). 遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内. 注意当你使用遮挡剔除时你依然受益于视锥体剔除Frustum Culling.  Unity3d游戏场景优化杂谈(4) 左边的场景使用了遮挡剔除. 右边的场景未使用遮挡剔除. 遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级. 这些数据可以让每个运行时间内的摄像机来确定什么能看见什么看不见。通过这些数据, Unity 将确定只把可以看见的物体送去渲染. 这将降低 draw calls 的数量并提供游戏的运行效率. occlusion culling的数据由单元(cells)组成. 每个单元是整个场景范围数值的一部分. 更多特定的单元来自一个二叉树( binary tree. Occlusion Culling使用两个叉, 一个给 View Cells (静态物体) 另一个给 Target Cells (移动物体). View Cells map给出了一个定义了静态可视物体的索引列表 (精确剔除后的静态物体). 非常重要的一点是在创建你的物体时要随时注意,因为你需要在物体的尺寸和单元的尺寸间取得一个好的平衡. 理想情况下, you shouldn't have cells that are too small in comparison with your objects but equally you shouldn't have objects that cover many cells.有时你可以通过将大的物体拆成几个部分来改进遮挡剔除效果. 无论如何你仍然能够将小的物体合并为一体来降低draw calls, 在它们都属于一些小的组件的时候, occlusion culling 将不起作用.确定组件中那个是可视的组件的选集和可视信息被认为是 PVS (潜在可视状态Potentially Visible Set). Occlusion Culling设置 为了使用遮挡剔除 需要进行相关的手动设置.首先 你关卡中的几何体必须被分割成明显的不同尺寸的块. 这也有助于布置关卡中小块的容易定义的区域 被其他大物体遮挡(例如墙,建筑物) 这意味着每个单独的mesh被确定是否渲染取决于 occlusion 数据. 所以如果你有一个物体包含了房间里的所有家具那么所有的家具要么全渲染,要么全不渲染. 是否渲染是基于组件而不是基于每个单独物体自身的。 在检视面板(Inspector 你需要标识(tag 所有需要应用遮挡剔除的场景物体。最快的方法是是将你需要标示为 Static的物体作为一个 Empty GameObject 的子物体并设置这个Empty GameObject Static,option出现的时候选择affect children. 当子物体被tagged as Static你可以取消子物体和