【Unity优化】图形优化系列02:CPU优化

摘要:
2) 有两个指令:DrawCall和SetPassCall;SetPassCall消耗最多的性能。3) 减少批处理的数量,以便更多的对象共享相同的渲染状态,这可以减少SetPassCall。两种渲染路径:前向渲染路径和延迟渲染路径优化方法:1)优化动态光2)使用烘焙光而不是动态光3)降低阴影质量和显示距离4)控制使用的反射探测器数量批次描述:一个批次包含多个对象的数据。3) 优化动画对象并减少模型顶点。4) 对于某些平台,可以使用GPUSkinning。
CPU在渲染管线中的工作

1)检测需要被绘制的对象

2)准备发送给GPU的指令

3)向GPU发送指令

多线程渲染

0)Unity 包含三种线程类型:主线程、渲染线程、工作线程

1)主线程:大部分的CPU工作,和部分渲染任务

2)渲染线程:专门用于CPU向GPU发送指令

3)工作线程:执行单独的任务(比如剔除、网格蒙皮)

4)不是所有平台都支持多线程渲染

多线程优化方法:

1)尝试开启 Player Settings 中的 Graphic Jobs 选项,看是否有性能提升

2)使用 Profiler Window 找到引起问题的任务

向GPU发送指令

线程:通常在渲染线程,特定平台在工作线程(PS4)

1)这步通常是导致CPU绑定的原因。

2)有两种指令:Draw Call 和 SetPass Call;其中 SetPass Call 最耗性能。

3)降低 batch 数,让更多对象共享相同的渲染状态,能够减少 SetPass Call。

4)三种方式降低 batch 和 SPC:减少渲染对象数量、减少对象渲染次数、合批

减少渲染对象数量

1)减少场景中对象数量

2)减少摄像机的绘制距离(Far Clip Plane)

3)使用摄像机的分层剔除功能(Layer Cull Distance)

4)使用遮挡剔除(Occlusion Culling)

5)实现定制的更高效的遮挡剔除

减少对象渲染次数

说明:实时灯光、阴影、反射,会导致对象被渲染多次。

两种渲染路径:前向渲染路径(Forward Rendering)、延迟渲染路径(Deferred Rendering)

优化方法:

1)优化动态光

2)使用烘焙光照替代动态光

3)降低阴影质量和显示距离

4)控制使用反射探针的数量

合批

说明:一个 Batch 包含了多个对象的数据。

合批规则:使用相同材质实例、具有标准化的材质设置

优化说明:就算合批没有减少SPC也能提升性能,因为CPU处理单个Batch要比多个高效

优化方法:

1)静态合批:相邻静态对象;缺点是提高内存占用

2)动态合批:静态或动态对象;缺点是提高CPU计算

3)GPU instancing:大量相同对象

4)UI合批

5)纹理图集:UI、2D、3D;Unity 内置 Sprite Pachker 工具

6)通过 Unity Editor 或代码,手动合并网格。缺点是不能单独剔除对象。

7)任何对 Render.material 的使用,都会返回一个新的材质实例。因为不再是同一个材质,因此无法被合批。使用 Render.sharedMaterial 替代。

剔除、准备与合批

线程:主线程,或工作线程
1)剔除工作通常消耗不大:关闭不需要的摄像机、renderer

2)合批能提升发送指令的速度,但是也要注意合批是否引起了CPU绑定

蒙皮(Skinned meshes)

线程:主线程,或工作线程

说明:使用骨骼动画驱动网格时,需要使用 SkinnedMeshRenderer 组件。

优化方法:

1)对于没有动画的对象,使用 MeshRenderer 组件替代 SkinnedMeshRenderer 组件;或导入时选择不导入动画,则自动替换为 MeshRenderer。

2)对于只有一段时间播放动画的,在不播放动画时替换为更简单的Mesh,或使用 MeshRenderer 替换 SkinnedMeshRenderer。

3)优化动画对象,减少模型顶点。

4)某些平台,可以使用 GPU Skinning。

主线程中和渲染无关的操作

主线程还要处理许多和渲染无关的操作,当渲染优化无法解决问题时,可以通过优化渲染无关的部分,来提升性能。

免责声明:文章转载自《【Unity优化】图形优化系列02:CPU优化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mac下Python和Pycharm之virtualenvAWTK(Toolkit AnyWhere): 为嵌入式、手机和桌面开发的通用GUI下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jmeter(八)

 ------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.com/du-hong/p/13037317.html ----------------------------------------------------...

Unity多语言本地化改进版

简介 之前捣鼓过一个通过csv配置游戏多语言支持的小工具,但是发现使用过程中,通过notepad++去进行转码很不方便,并且直接将配置的csv不加密的放在游戏中心里感觉不是很踏实 于是乎~~ 新的方案 1.在PC/MAC平台上解析多语言配置,也就是editor运行环境中解析csv或者excel 2.通过在Editor运行过程中生成多个语言对象,然后序列化并...

Unity3D研究之支持中文与本地文件的读取写入(转)

前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写。当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原来是他文件的路径写错了。开发中往往一道很难的问题解开的时候发现原来真的非常的简单,哇咔咔。 刚好在MOMO的书中也有涉及到文件的读取与写入,那么本节我将书中的部分...

一、从Windows消息机制说起

    一,消息       消息(Message)指的就是Windows 操作系统发给应用程序的一个通知,它告诉应用程序某个特定的事件发生了。比如,用户单击鼠标或按键都会引发Windows 系统发送相应的消息。最终处理消息的是应用程序的窗口函数,如果程序没处理的话操作系统有默认函数将会作出处理。     从数据结构的角度来说,消息是一个结构体,它包含了...

什么是零拷贝

 1、名词介绍   内核:操作系统的核心   用户空间:指的是用户进程的运行空间   内核空间:指的是内核的运行空间   用户态:如果进程运行在用户空间就是用户态   内核态:如果进程运行在内核空间就是内核态   DMA拷贝:     对一个IO操作而言,是通过CPU发出对应的指令来完成的,但是相比CPU来说,IO的速度太慢了,CPU有大量的时间处于等待I...

浅谈 linux 多线程编程和 windows 多线程编程的异同

原文:http://software.intel.com/zh-cn/blogs/2011/03/24/linux-windows/ 很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他...