Rendering performance enhancements

Enable/Disable GPU Skinning

开启GPU Skinning可以减轻CPU或GPU中Front End部分中某一个的负担,但是会加重另一个的负担。Skinning是mesh中的顶点根据动画中骨骼的当前位置进行计算,从而让角色摆出正确的姿势。

顶点的计算过程可以放在CPU也可以放在GPU的Front End 部分,取决于是否开启GPU Skinning。可以通过 Edit | Project Settings | Player Settings | Other Settings | GPU Skinning 设置。

开启后,计算会放在GPU的Frond End中,但是CPU并不是一点工作都不做了,还是需要传输数据到GPU并且要在Command Buffer中生成指令。如果不开启,则计算在CPU中完成,传输到GPU中的数据已经是计算好的顶点数据。所以根据CPU和GPU的状态可以灵活决定应该在哪算,如果CPU负担太重就开启,把工作丢给GPU。

Reduce geometric complexity

这条跟GPU中的Font End相关。很多时候用不到需要多套无用UV和法线数据的mesh。尽量减少顶点数量,有三种途径:

1. 让美术老铁们手动减少顶点数量重新生成mesh

2. 干脆从场景里删掉,当然这是最坏情况

3. 使用LOD等技术自动对mesh进行culling

Reduce Tessellation

通过Geometry Shaders中使用Tessellation技术会带来很大的体验提升,但是也给GPU中Frond End增加了负担。目前对于如和优化Tessellation也没啥好办法,还是尽量优化Frond End中其他地方给Tessllation省出更多空间吧。

Employ GPU Instancing

GPU Instancing比Dynamic Batching更高效,因为它并不需要mesh的合并,但是也要求更严格,material引用和mesh必须都一致才可以。GPU Instancing可以有效的减少Draw Call,但是它在Unity中默认是没有被开启的,在每个material中可以设置是否开启。

  • Unity automatically picks MeshRenderer components and Graphics.DrawMesh calls for instancing. Note that SkinnedMeshRenderer is not supported.

  • Unity only batches GameObjects that share the same Mesh and the same Material in a single GPU instancing draw call. Use a small number of Meshes and Materials for better instancing efficiency. To create variations, modify your shader scripts
     to add per-instance data (see next section to learn more about this).

https://docs.unity3d.com/Manual/GPUInstancing.html

Use mesh-based Level Of Detail(LOD)

LOD就是根据物体和摄像机的距离不同可以自动使用不同精度的mesh,因为距离很远的地方根本没必要用精度很高的模型。

LOD的缺点之一是开发起来比较费劲,会需要美术提供不同精度的模型,场景设计师需要生成LOD Groups,还要进行测试效果,这会花费很多时间,当然目前一些插件提供了自动生成LOD Mesh的功能。

LOD另一个缺点是需要消耗更多的磁盘和内存以及CPU,但是优点也非常明显,就可以有效减少顶点数量,降低Draw Call和Fill Rate以及 Memory Bandwidth。

LOD也不是总适用,对于内景以及摄像机是从上往下俯角的游戏,比如RTS和MOBA类游戏,物体和摄像机的距离基本都一致,所以LOD根本不会起到什么效果。

总之是否使用LOD需要视情况而定,如果性能并没有出现瓶颈,没有必要使用。

Culling Groups

通过脚本,可以自定义LOD系统,比如可以根据distance使用不同精度的动画,使用不同的shader以及粒子特效等。当然使用Culling Gropus也会带来开发上额外的工作量。https://docs.unity3d.com/Manual/CullingGroupAPI.html

Make use of Occlusion Culling

同时能降低Fill Rate和Overdraw最好的途径之一就是使用Occlusion Culling(遮挡剔除)。Frustum Culling(视锥剔除)只能剔除掉摄像机外的物体,但是对于摄像机内的物体,常规渲染的顺序是从远到近,因此当近物体挡住了远处物体时,就会产生OverDraw。

没有遮挡剔除时,远处物体也会被渲染
​​​​

Occlusion Culling可以有效剔除摄像机内被近处物体挡住的部分。Unity把场景切割成cells,在Editor中烘焙生成Cells间遮挡剔除关系的数据,在运行时,加载烘焙好的数据到内存中,对于设置了遮挡剔除的摄像机,就会根据这个数据来进行渲染。

使用遮挡剔除时,远处物体会被剔除掉
​​​​

只有标记为Occluder Static 或者 Occludee Static的物体可以产生遮挡剔除数据。对于普通物体,既能遮挡其他物体又能被其他物体遮挡,使用Occluder。对于透明物体,并不能遮挡其他物体,使用Occludee。

开启Occlusion Culling会增加存储空间和内存以及CPU的开销,因此对于Occlusion Culling烘焙时要设置合适的Cell参数。

特别注意的是即使物体被Occlusion Culling剔除掉了,但是它的阴影依然会被渲染。

Optimizing Particle Systems

粒子系统中,要注意粒子生成的数量以及使用Shader的复杂度,粒子的数量会影响Front End,而shader中使用大量的Texture会

在Back End消耗Fill Rate和Memory Bandwidth。

最直接的优化方法就是减少粒子数量和减少特效数量,使用图集也是优化方法之一。但是经常忽略的一个优化方法是使用Particle System Culling。

Make use of Particle System Culling

关于 Particle System Culling 的一篇blog:https://blogs.unity3d.com/2016/12/20/unitytips-particlesystem-performance-culling/.

Particle System Culling的基本原理就是是否可以预测,如果一个粒子特效的各种参数设置使得其行为样式时可以被预测的,当它并不在视野中时就可以自动的被剔除掉,当重新进入视野中时,因为是可以预测的,所以可以计算出此时此刻应有的样子。

但是一些设置可能会导致粒子系统变得不可预测或者非程序化,那就无法使用Particle System Culling,无论是否可见,粒子系统必须一直保持运行。比如Particle System 使用world-space坐标,使用碰撞,或者复杂的动画曲线等等,都可能会使得其不可预测。Unity提供了一个非常有用的Warning,来提示改设置是否会导致粒子系统无法自动 Culling。

Avoid recursive Particle System calls

Particle System中很多方法都是递归的,调用他们会遍历每一个child并且调用 GetComponent<ParticleSystem>()函数,当层级非常复杂时,会有比较大的开销。

Start(), Stop(), Pause(), Clear(), Simulate(), and isAlive()都是这种函数。但是这些函数里其实有个withChildren参数,Unity默认设置为true,如果手动设置为false,就可以避免递归行为。

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)相关推荐

  1. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (6)

    1. Use less texture data 这条优化技巧非常直接,减少texture的数据量,减少分辨率或者降低位数,虽然可能会降低渲染质量.但是通常使用16-bit textures并不会明显 ...

  2. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化

    Shader optimization Fill Rate和 Memory Bandwidth开销最大的地方就是Fragment Shader.开销多大取决于Fragment Shader的复杂程度: ...

  3. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (4)

    Optimizing Unity UI 本章讲探讨一些能够提升UGUI性能的优化方法. 1.Use more Canvases 一个Canvas的主要任务就是管理它层级下的所有UI元素,并且通过Dra ...

  4. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(2)

    Lighting and Shadowing 现代的游戏中,基本没有物体能在一步就完成渲染,这是因为有光照和阴影的关系.光照和阴影的渲染在Fragment Shader中需要额外的pass. 首先要设 ...

  5. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(1)

    The Rendering Pipeline 渲染表现差有可能取决于CPU端(CPU Bound)也有可能取决于GPU(GPU Bound).调查CPU-bound的问题相对简单,因为CPU端的工作就 ...

  6. Unity 2017 Game Optimization 读书笔记 The Benefits of Batching

    batching(合批) 和大量的描述一个3D物体的数据有关系,比如meshes,verices,edges,UV coordinates 以及其他不同类型的数据.在Unity中谈论batching, ...

  7. Unity 2017 Game Optimization 读书笔记(1)Scripting Strategies Part 1

    1.Obtain Components using the fastest method Unity有多种Getcomponet的方法: GetComponent(string), GetCompon ...

  8. Unity 2017 Game Optimization 读书笔记 Scripting Strategies Part 5

    一. Disable unused scripts and objects 场景中激活的物体或者脚本越多,开销越大.对于很多并没有产生作用的脚本和物体,可以隐藏掉从而提升性能,比如FPS游戏中视野外的 ...

  9. Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4

    1.Avoid Find() and SendMessage() at runtime SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的.Sen ...

最新文章

  1. 火星浏览器_「超详细Filecoin矿工手册」IPFS的应用以及意义 | 火星号精选
  2. c# select标签绑定枚举,并以Description做Text显示
  3. linux服务器终止进程,结束linux 服务器系统中一个程序的多个进程
  4. 删除数组中重复的数字
  5. deeplab v3 ppt_「秋叶PPT」被这件事难倒的张雨绮,撕开了千万职场人最羞愧的一面...
  6. 值得收藏的一些Java实战项目分享
  7. 新手程序员必学的代码编程技巧
  8. FusionChartsFree调用json数据的简单例子
  9. MySql -- 数据库备份工具xtrabackup
  10. html页面如何嵌套if标签,IF嵌套10个以上
  11. php判断无理数,重新整理证明:无理数在数轴上不存在的逻辑证明
  12. PHP 2014 CHM手册
  13. Linux电源管理(五)thermal【转】
  14. Linux 中VirtualBox6.0.8 仅主机模式不可用
  15. 采访:新浪微博架构师兼首席PHP技术顾问惠新宸谈PHP的架构与发展
  16. 考试系统服务器考试机,考试系统
  17. 记录几个免费质量高的图库视频库
  18. 微信高级群发之预览接口
  19. history查看历史操作记录,并显示操作时间
  20. 搭建完整的开发环境--Linux下的开发

热门文章

  1. matlab 分号;_MATLAB使用教程(二)—新手来看
  2. 01背包,完全背包,多重背包,分组背包的使用条件以及代码模板
  3. 计算机编程英语用语,计算机编程英语词汇
  4. 卷积神经网络(CNN)详解及TensorFlow2代码实现
  5. windows 搭建python 虚拟环境 写程序_Sublime下配置python编译环境及搭建虚拟环境:(windows下大致相同)...
  6. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)
  7. JMeter压测入门简单使用
  8. 我用AI回怼美女汽车销售系列[yolo车牌识别](五) 完结
  9. 太监式的自主知识产权研发特色 (Z)
  10. Servlet容器中web.xml配置context-param与init-param