成都龙图教育:Unity中Draw Call的性能优化
laya drawcalloptimize原理
laya drawcalloptimize原理Laya DrawCall优化原理在使用LayaAir引擎进行游戏开发时,DrawCall(绘制调用)优化是一个关键的性能优化点。
DrawCall是指每次绘制一个物体或元素时,需要向GPU发送一次绘制指令。
过多的DrawCall会导致游戏性能下降,因此优化DrawCall数量是提高游戏性能的关键。
LayaAir引擎通过一些原则和技术来优化DrawCall,下面将详细介绍这些原理。
1. 合批渲染(Batching):合批渲染是指将多个绘制物体或元素合并成一个绘制指令,从而减少DrawCall 数量。
通过合并相同材质(Material)和纹理(Texture)的物体,可以减少绘制调用次数。
在LayaAir引擎中,可以使用Unity中的图集工具或动态合并工具,将多个独立贴图合并成一个大的贴图,从而实现合批渲染。
2. 纹理压缩(Texture Compression):纹理压缩是将纹理数据进行压缩,减少纹理占用的内存空间。
压缩后的纹理需要被解压缩后才能使用,但能减少GPU对纹理数据的处理量,提高绘制性能。
在LayaAir引擎中,可以使用ETC1、PVRTC和ASTC等压缩格式进行纹理压缩。
3. 减少不可见物体绘制:当物体或元素不可见时,绘制调用是没有必要的。
因此,在开发过程中应该尽量避免绘制不可见的物体。
可以通过设置物体的可见属性或使用遮挡剔除技术(如Frustum culling)来减少不可见物体的绘制。
4. 减少动态矩阵变换:动态矩阵变换是指物体在3D空间中的旋转、缩放、平移等变换操作。
过多的矩阵变换会增加GPU的负担,影响DrawCall性能。
因此,在开发时应尽量减少动态矩阵变换的使用,尽量使用静态矩阵变换来优化。
总结:通过合批渲染、纹理压缩、减少不可见物体绘制和减少动态矩阵变换等原理,可以有效地优化LayaAir引擎中的DrawCall,提高游戏性能。
unity优化方案
unity优化方案Unity是一款广泛应用于游戏开发和虚拟现实领域的强大游戏引擎。
然而,由于游戏的复杂性和庞大的资源需求,开发者常常面临性能瓶颈和优化挑战。
本文将介绍一些常见的Unity优化方案,以帮助开发者提高游戏性能和用户体验。
一、减少渲染批次渲染批次是指单位时间内GPU绘制的次数。
较高的渲染批次数量会导致性能下降。
为了减少渲染批次,可以使用以下方法:1. 合并网格:将多个网格合并为一个,减少绘制调用。
2. 减少材质数量:合并使用相同材质的物体,避免过多材质调用。
3. 避免动态批处理:避免在运行时设置材质属性,如颜色等。
二、使用LOD技术LOD(Level of Detail)技术是一种动态调整模型细节的方法。
在远处,使用较低细节的模型,近处使用更高细节的模型,以减少CPU和GPU的负担。
Unity中可以使用LOD Group组件进行设置。
三、优化光照和阴影光照和阴影对游戏画面效果有着重要影响,但同时也会占用大量的资源。
为了优化光照和阴影:1. 减少光源数量:合理控制场景中的光源数量,使用较少数量的光源。
2. 降低阴影分辨率:通过降低阴影的质量和分辨率,减少GPU的负载。
四、使用对象池技术对象池技术是一种用于重复创建和销毁开销较大的对象的优化方法。
通过对象池,可以避免频繁的创建和销毁对象,提高性能。
在Unity中,可以使用Object Pooling插件进行对象池的管理。
五、优化脚本脚本是Unity游戏逻辑的基础,因此脚本的性能优化十分重要。
以下是一些优化脚本的建议:1. 避免频繁的内存分配:减少使用new关键字进行实例化,使用对象池重复利用对象。
2. 使用对象缓存:将常用的对象缓存在字段中,避免每次访问时的查找操作。
3. 减少Update函数的调用:避免在Update函数中进行频繁的计算和操作,尽量将更新逻辑放到需要时进行。
六、合理使用资源资源是构建游戏世界的材料,合理使用资源对游戏性能和空间占用有重要影响。
Unity性能优化方法总结(不是原创)
Unity性能优化⽅法总结(不是原创)资源分离打包与加载 游戏中会有很多地⽅使⽤同⼀份资源。
⽐如,有些界⾯共⽤同⼀份字体、同⼀张图集,有些场景共⽤同⼀张贴图,有些怪物使⽤同⼀个Animator,等等。
在制作游戏安装包时将这些公⽤资源从其它资源中分离出来,单独打包。
⽐如若资源A和B都引⽤了资源C,则将C分离出来单独打⼀个bundle。
在游戏运⾏时,如果要加载A,则先加载C;之后如果要加载B,因为C的实例已经在内存,所以只要直接加载B,让B指向C即可。
如果打包时不将C从A和B分离出来,那么A的包⾥会有⼀份C,B的包⾥也会有⼀份C,冗余的C会将安装包撑⼤;并且在运⾏时,如果A和B都加载进内存,内存⾥就会有两个C实例,增⼤了内存占⽤。
资源分离打包与加载是最有效的减⼩安装包体积与运⾏时内存占⽤的⼿段。
⼀般打包粒度越细,这两个指标就越⼩;⽽且当两个renderQueue相邻的DrawCall使⽤了相同的贴图、材质和shader实例时,这两个DrawCall就可以合并。
但打包也并不是越细就越好。
如果运⾏时要同时加载⼤量⼩bundle,那么加载速度将会⾮常慢——时间都浪费在协程之间的调度和多批次的⼩I/O上了;⽽且DrawCall合并不见得会提⾼性能,有时反⽽会降低性能,后⽂会提到。
因此需要有策略地控制打包粒度。
⼀般只字体和贴图这种体积较⼤的公⽤资源。
可以⽤AssetDatabase.GetDependencies得知⼀份资源使⽤了哪些其它资源。
2 贴图透明通道分离,压缩格式设为ETC/PVRTC 最初我们使⽤了DXT5作为贴图压缩格式,希望能减⼩贴图的内存占⽤,但很快发现移动平台的显卡是不⽀持的。
因此对于⼀张1024x1024⼤⼩的RGBA32贴图,虽然DXT5可将它从4MB压缩到1MB,但系统将它送进显卡之前,会先⽤CPU在内存⾥将它解压成4MB的RGBA32格式(软件解压),然后再将这4MB送进显存。
了解DrawCall
了解DrawCall⼀、什么是DrawCallDrawCall的含义就是CPU调⽤图像编程接⼝,以命令GPU进⾏渲染的操作。
CPU和GPU通过使⽤⼀个命令缓冲区实现并⾏⼯作。
命令缓冲区包含⼀个命令队列,CPU向其中添加命令,GPU 从中读取命令,添加和读取是相互独⽴的,因此使得CPU和GPU可以独⽴⼯作。
命令缓冲区中的命令有很多种类,DrawCall就是其中⼀种。
⼆、为什么DrawCall多了会影响帧率DrawCall中真正造成性能问题的元凶是CPU。
在每次调⽤DrawCall之前,CPU需要向GPU发送很多内容,包括数据、状态和命令等。
在这⼀阶段,CPU需要完成很多⼯作,例如检查渲染状态等。
⽽⼀旦CPU完成了这些准备⼯作,GPU就可以开始本次渲染。
GPU的渲染能⼒很强,渲染速度往往快于CPU提交命令的速度。
如果DrawCall的数量太多,CPU就会把⼤量时间花费在提交DrawCall 上,造成CPU的过载。
三、DrawCall优化优化有⼀下⼏个解决⽅案:1、使⽤Draw Call Batching,也就是批处理。
Unity在运⾏时可以将⼀些物体进⾏合并,从⽽⽤⼀个DrawCall来渲染他们。
具体下⾯会介绍。
2、通过把纹理打包成图集来尽量减少材质的使⽤。
3、尽量少的使⽤反光,阴影之类的,因为那会使物体多次渲染。
Draw Call Batching技术Unity内置了Draw Call Batching技术,它的主要⽬标就是在⼀次DrawCall中批量处理对个物体。
只要物体的变换和材质相同,GPU就可以按完全相同的⽅式进⾏处理,即可以把它们放在⼀个Draw Call中。
Draw Call Batching技术存在缺陷,当它需要把⼀个Batch中的所有物体组合到⼀起,相当于创建了⼀个与这些物体加起来⼀样⼤的物体。
这就需要分配相应⼤⼩的内存,也需要消耗CPU时间。
特别是对于移动的物体,每⼀帧都得重新进⾏组合。
引擎使用技巧”
引擎使用技巧”为了让引擎更高效地工作,了解一些引擎使用技巧是非常重要的。
以下是一些常用的技巧和方法,可以帮助你在开发过程中更好地使用引擎:一、优化渲染性能1. Draw Call 的数量对性能影响较大,尽量减少 Draw Call 的数目可以提高渲染性能。
可以通过以下方式来减少 Draw Call 的数量:• 合批渲染:将多个相同的物体合并成一个渲染批次,减少 Draw Call2. 在 Unity 中,静态物体的渲染效率要比动态物体高。
因此,可以通过合理规划场景布局和使用静态光照等技术,优化渲染性能。
3. 使用 LOD 技术,对高多边形的物体进行分级渲染,能够有效提高渲染效率。
5. 在实时渲染的情况下,可以使用延迟渲染等技术,能够更好地优化渲染性能。
1. 在开发过程中,尽量使用基本形状的碰撞器,例如:盒子碰撞器、球形碰撞器等。
复杂的形状碰撞器会导致物理性能下降。
2. 在物理引擎中,尽量减少物理碰撞器数量和减小物理碰撞器的精度,能够提高物理性能。
3. 使用物理引擎前,先考虑是否真的需要使用物理模拟。
当模拟物理效果对游戏影响不大时,可以考虑使用其他方式模拟效果。
4. 在物理模拟过程中,开启着色器选项,能够有效提高物理性能。
三、内存优化1. 在使用引擎过程中,尽量避免使用过多的内存占用。
在开发过程中,可以使用内存分析工具,根据内存占用查找问题所在。
2. 使用资源池技术,多次使用的资源放到一个池中,能够有效地减少内存开销。
3. 使用压缩纹理或将一个大贴图分割成多个小贴图来减小内存占用。
4. 在动态加载资源时,尽可能的使用异步加载,不会阻塞主线程,减少了 CPU 负载。
四、代码优化1. 在代码中,尽量避免频繁的内存分配和销毁,多次使用的变量可以使用对象池。
2. 避免在 Update 循环中使用大量计算,可以将计算放到 Coroutine 协程中。
3. 在开发中,避免使用 GetComponent 或 Find 函数,这两个函数的性能开销较大。
Unity游戏运行优化与调试技巧
Unity游戏运行优化与调试技巧Chapter 1:Unity游戏运行优化基础知识Unity是一款非常流行的游戏开发引擎,然而,在开发大型游戏时,我们经常遇到性能问题。
为了确保游戏在不同平台上的流畅运行,我们需要学习一些游戏运行优化的基础知识。
1.1 减少Draw CallsDraw Calls是GPU渲染场景中的一次操作,过多的Draw Calls 会影响游戏的性能。
为了减少Draw Calls,我们可以合并物体、使用批处理功能和减少纹理切换。
此外,还可以通过使用静态批处理和动态批处理技术来提高性能。
1.2 使用LOD技术LOD(Level of Detail)技术是一种根据距离远近渲染不同细节的方法。
通过在远处使用低细节模型,可以有效减少渲染物体的数量,从而提高游戏性能。
1.3 优化碰撞检测碰撞检测是游戏中常见的操作之一,然而,过多的碰撞检测会占用大量计算资源。
为了优化碰撞检测,我们可以使用物理层、限制碰撞的检查范围以及使用较为简单的碰撞体。
Chapter 2:提高游戏运行性能的进阶技巧除了基础的运行优化技巧外,还有一些进阶的技巧可以进一步提高游戏的性能。
2.1 使用对象池对象池是一种可以重复使用游戏对象的方法。
通过对象池,我们可以避免频繁地创建和销毁对象,从而降低了资源的开销,提高了游戏的性能。
2.2 异步加载资源游戏中的资源加载通常是一个耗时的操作,会影响游戏的运行速度。
为了解决这个问题,可以使用异步加载资源的方式。
异步加载资源可以让游戏在资源加载的同时继续运行,减少了游戏的等待时间。
2.3 优化ShaderShader是游戏中一个非常重要的组成部分,然而,复杂的Shader会对游戏的性能产生负面影响。
通过简化Shader的逻辑、减少不必要的计算和优化贴图的使用,可以提高游戏的渲染效率。
Chapter 3:Unity游戏调试技巧在游戏开发过程中,调试是一个非常重要的环节。
下面介绍一些Unity游戏调试的技巧和工具。
Unity性能优化-DrawCall
Unity性能优化-DrawCall1. DrawCall是啥?其实就是对底层图形程序(⽐如:OpenGL ES)接⼝的调⽤,以在屏幕上画出东西。
所以,是谁去调⽤这些接⼝呢?CPU。
⽐如有上千个物体,每⼀个的渲染都需要去调⽤⼀次底层接⼝,⽽每⼀次的调⽤CPU都需要做很多⼯作,那么CPU必然不堪重负。
但是对于GPU来说,图形处理的⼯作量是⼀样的。
所以对DrawCall的优化,主要就是为了尽量解放CPU在调⽤图形接⼝上的开销。
所以针对drawcall我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好⼀起渲染。
2. 优化⽅式(1)Draw Call Batching采⽤批处理⽅式,Unity在运⾏时可以将⼀些物体进⾏合并,从⽽⽤⼀个描绘调⽤来渲染他们。
静态批处理:物体不移动,并且拥有相同的材质,静态批处理就允许引擎对任意⼤⼩的⼏何物体进⾏批处理操作来降低描绘调⽤。
例如:在⼀个3D场景中,有Cube、Capsule、Cylinder、Sphere这个4个GameObject,注意之间不要有遮挡,另外还有Camera和Direction Light,它的处理前后的统计数据如下:动态批处理在这⾥使⽤时,遇到了坑,很多资料都没有提及到,在默认情况下,Unity是没有打开的,需要在Player Settings中进⾏设置的:⽤了⼀个不错的例⼦来看,for(int i = 0; i < 500; i++){GameObject cube;cube = GameObject.Instantiate(prefab) as GameObject;}动态批处理的结果是⾮常明显的(塔防游戏中估计能提⾼不少效率)DrawCall的动态批处理存在着很多约束,所以默认是关闭的a. 需要在每个顶点上进⾏⼀定的开销,所以动态批处理仅⽀持⼩于900顶点的⽹格物体;b.着⾊器使⽤顶点位置,法线和UV值三种属性,那么你只能批处理300顶点以下的物体;如果你的着⾊器需要使⽤顶点位置,法线,UV0,UV1和切向量,那你只能批处理180顶点以下的物体(这个地⽅不懂);c.不要使⽤缩放。
Unity优化----drawcall系列
Unity优化----drawcall系列本⽂由博主(国宝⼤熊猫)原创,转载请注明出处:知识普及:*Drawcall影响的是CPU的效率。
因为draw call是CPU调⽤图形接⼝在屏幕上绘制对应的东西。
主体:为了在屏幕上draw⼀个物件(因为render和draw有些区别,所以为了区分清楚,这些概念⽤英⽂),引擎需要提供⼀个draw call的API。
draw call调⽤性能开销是很⼤的,会导致CPU部分的性能负载。
这通常是因为draw call间的状态改变(例如不同材质间的切换)导致,因为这些⾏为会导致显卡驱动进⾏开销很⼤的验证和转化步骤。
Unity⽤static batch来处理这件事情。
static batch的⽬的是为了⽤尽可能少的缓冲区来重组尽可能多的mesh,从⽽获得更好的性能。
因⽽static batch会出现⼀些巨⼤的mesh被渲染,⽽不是很多的⼩mesh被渲染。
合并后的这些资源虽然在不同的地⽅出现,但是Unity会认为是同样的资源(因为这些⼩资源已经合并了)来循环进⾏渲染。
它会为每个static bached mesh来做⼀系列的快速的draw call。
构建时做batch,在Unity5中只有⼀种⽅式,会构建index buffer,然后⼀个draw call会被提交来⽤来处理合并的mesh⾥的每个可见的⼦mesh材质只有使⽤同样材质的物件才能够合并。
因⽽,如果你想获得好的合并效果,你需要尽可能多的使不同的物件贡献同样的材质。
如果你有两个典型的材质,它们仅仅只是贴图不同,你可以合并这些贴图到⼀个⼤的贴图⾥----这个过程通常叫做texture atlasing(也就是图集)。
⼀旦贴图在同⼀个图集⾥,你就能只使⽤⼀个材质来代替。
*texture atlasing可参见以下⽹页https:///wiki/Texture_atlas如果你需要从脚本⾥获得共享重⽤的材质属性,你要注意修改Rendering.material将会创建这个材质的拷贝。
Unity3d DrawCall 优化
优化从哪里入手:1.drawCall :其实就是对底层图形程序接口的调用,在屏幕上画出的东西,CPU去调用这些接口。
2.fragment:经常有人说vf是什么,vertex我们都知道是顶点,那fragment是什么?fragment是有可能成为像素(像素构成影像的基本单位)的东西,是一种最终不会确定是否会被画出来的东西,是潜在的像素,涉及到GPU3.batching:将批处理之前需要很多次调用(drawcall)的物体合并,之后只需要调用一次底层图形程序的接口就行CPU方面的优化:上文说drawcall 影响的是CPU的效率,区里还有哪些会影响CPU效率。
DrawCalls物理组件GC(GC是处理内存的)DrawCall:DrawCall是CPU调用底层图形的的接口,每一个渲染都需要调用一次底层接口,所以对DrawCall的优化,主要是为了尽量解放CPU在调用图形接口上的开销,所以多个物体一起渲染,尽量减少渲染次数。
按照思路有几种方案:1.使用DrawCallBatching,也就是描绘调用批处理。
Unity在运行时可以讲一些物体进行合并,从而用一个描绘调用来渲染他们。
2.通过吧文理打包成图集。
来尽量减少材质的使用3.尽量少的使用反光,阴影DrawCallBatching:首先我们先理解为何2个没有使用相同材质的物体计时使用过了批处理,也无法实现DrawCall数量的下降和性能上的提升因为被“批处理”的2个物体的网格模型需要使用相同材质的目的,在于其纹理是相同的,在于其纹理是相同的,这样才可以实现同时渲染的目的。
因而保证材质相同,是为了保证被渲染的纹理相同。
为了将2个纹理不同的材质合二为一,就需要纹理打包成图集。
而DarCallBatching 本身,也会细分为2种。
Static Batching 静态批处理定义:只要这些物体不移动,并且拥有相同的材质,静态批处理就允许引擎对人一大小的物体进行批处理操作来降低描绘调用。
Unity游戏优化技巧
Unity游戏优化技巧一、概述游戏优化是游戏开发过程中非常重要的一环,它可以提高游戏的性能,优化游戏的流畅度和体验度。
本章将介绍一些Unity游戏优化的技巧,以帮助开发者更好地提升游戏性能。
二、资源优化1. 纹理压缩纹理在游戏中占据很大的内存空间,使用合适的纹理压缩格式可以减少纹理的内存占用。
在导入纹理时,选择适合当前游戏平台的压缩格式,如ETC2、ASTC等。
2. 着色器合并游戏中使用过多的着色器会增加渲染开销,可以通过合并相似的着色器来减少着色器的数量。
使用Unity的着色器合并工具可以将多个着色器合并成一个,从而减小渲染负载。
3. 预加载资源在游戏开始前,预加载游戏必备的资源,避免游戏过程中的卡顿和加载延迟。
可以利用Unity的异步加载功能来实现资源的预加载,确保游戏的流畅运行。
1. 脚本优化脚本是游戏中执行逻辑的关键部分,优化脚本的性能可以提升游戏的运行速度。
避免在Update函数中频繁使用复杂的计算和内存分配,在必要时使用协程来替代Update函数。
2. 批处理优化批处理是指将多个物体的渲染操作合并成一个,减少渲染次数,从而提高性能。
通过将相同材质的物体放在一个批处理中,可以有效减少渲染开销。
另外,减少动态合批物体的数量也是一种优化手段。
3. 内存管理合理管理内存可以防止游戏因为内存不足而崩溃或卡顿。
使用对象池来管理频繁创建和销毁的对象,优化资源的加载和卸载过程,避免内存泄漏等问题。
四、图形优化1. LOD技术LOD(Level of Detail)技术可以根据物体距离观察者的远近,动态调整物体的细节层次,减少多余的绘制开销。
使用Unity自带的LOD组件或者自定义LOD算法,可以提高游戏的渲染性能。
光照是游戏图形中重要的一环,但是高质量的光照计算会给渲染性能带来很大压力。
可以通过使用低质量的光照效果、减少光源的数量和范围等方式来优化光照。
3. Shader优化Shader是决定游戏图像质量的关键因素之一,在编写Shader时需要注意避免过多的纹理采样和复杂的计算。
基于Unity3D的游戏性能优化和测试
基于Unity3D的游戏性能优化和测试Unity3D是一款广泛应用于游戏开发的跨平台游戏引擎,它的强大功能和易用性吸引了众多开发者。
然而,在开发过程中,游戏性能优化和测试是至关重要的环节。
本文将介绍基于Unity3D的游戏性能优化和测试的相关内容,帮助开发者更好地提升游戏性能和用户体验。
1. 游戏性能优化1.1 内存管理在Unity3D中,合理的内存管理对游戏性能至关重要。
开发者可以通过以下方式来优化内存管理:资源加载:合理管理资源加载和卸载,避免资源过多导致内存泄漏。
对象池:使用对象池技术重复利用对象,减少频繁创建和销毁对象所带来的性能消耗。
Texture压缩:使用适当的Texture压缩格式,减小纹理内存占用。
1.2 图形优化图形渲染是游戏性能的重要组成部分,开发者可以通过以下方式进行图形优化:合批处理:尽量减少Draw Call数量,合并渲染操作,提高渲染效率。
LOD技术:使用LOD(Level of Detail)技术,根据距离调整模型细节级别,减少不必要的绘制。
光照优化:合理设置光照参数,避免过多光源导致性能下降。
1.3 脚本优化脚本编写也会对游戏性能产生影响,开发者可以通过以下方式进行脚本优化:避免过多循环:减少循环次数,避免嵌套过深的循环结构。
代码精简:删除冗余代码,提高代码执行效率。
使用协程:合理使用协程来处理异步操作,避免阻塞主线程。
2. 游戏性能测试2.1 性能测试工具在进行游戏性能测试时,选择合适的性能测试工具非常重要。
以下是一些常用的Unity3D性能测试工具:Unity Profiler:Unity自带的性能分析工具,可以监控CPU、GPU、内存等性能数据。
Frame Debugger:用于检查每一帧的渲染过程,帮助定位性能瓶颈。
Android Profiler:针对Android平台进行性能测试和分析的工具。
2.2 性能测试指标在进行游戏性能测试时,需要关注一些重要的性能指标:帧率(FPS):游戏每秒渲染的帧数,通常目标帧率为60FPS。
unity3d游戏开发之优化技术(2)
可以看到Draw Calls一下子变成了5。
这是因为新添加的箱子模型中,包含了474个顶点,而它使用的顶点属性坐标、法线等信息,使用的总和超过了900。
动态批处理的条件这么多,一不小心它就不干了,因此Unity提供了另一个方法,静态批处理。
接着上面的保持修改后的缩放,但把四个物体的“Static Flag”勾选上:点击Static后面的三角下拉框,我们会看到其实这一步设置了很多东西,这里我们想要的只是“Batching st 时我们再看Draw Calls,恩,还是没有变化。
但是不要急,我们点击运行,变化出现了。
Draw Calls又回到了3,并且显示Save by batching是1。
这就是得利于静态批处理。
而且,如果我们在运型的网格,会发现它们都变成了一个名为Combined Mesh (roo: scene)的东西。
这个网格是Unity合并了所有标的物体的结果,在我们的例子里,就是四个物体:你可以要问了,这四个对象明明不是都使用了一个材质,为什么可以合并成一个呢?如果你仔细观察上图的里面标明了“4 submeshes”,也就是说,这个合并后的网格其实包含了4个子网格,也就是我们的四个对象。
对网格,Unity会判断其中使用同一个材质的子网格,然后对它们进行批处理。
但是,我们再细心点可以发现,我们的箱子使用的其实是同一个网格,但合并后却变成了两个。
而且,我们后Stats窗口中的“VBO total”,它的大小由241.6KB变成了286.2KB,变大了!还记得静态批处理的缺点吗?就用更多的内存。
文档中是这样写的:“Using static batching will require addition al memory for storing the combined geometry. If several objec same geometry before static batching, then a copy of geometry will be created for each object, either in the E runtime. This might not always be a good idea – sometimes you will have to sacrifice rendering performance static batching for some objects to keep a smaller memory footprint. For example, marking trees as static in a level can have serious memory impact.”也就是说,如果在静态批处理前有一些物体共享了相同的网格(例如这里的两个箱子),那么每一个物体都网格的复制品,即一个网格会变成多个网格被发送给GPU。
Unity3D教程:DrawCall优化
Unity3D教程:DrawCall优化
Posted on 2013年07月16日 by U3d / Unity3D 基础教程 /被围观 130 次Unity3D 对于移动平台的支持无可厚非,但是也有时候用Unity3D 开发出来的应用、游戏在移动终端上的运行有着明显的效率问题,比如卡、画质等各种问题。
自己在做游戏
开发的时候偶有所得。
对于主要影响性能的因素做个总结。
主要因素有:
1.Drawcall 值过大
Drawcall 值过大,所需要的GPU 的处理性能较高,从而导致CPU的计算时间过长,于是就卡了。
2.点、面过多
点、面过多,GPU 根据不同面的效果展开计算,并且CPU计算的数据也多,所以效果出来了。
由于Drawcall 值过大所引起的卡的问题我所做的优化方式有:
1.对于模型:
Mesh 合并,有个不错的插件(DrawCall Minimizer ---> 直接上Asset Store 下载即可,免费的,而且有文档,很容易上手)
2.对于UI:
尽量避免使用Unity3D自带的 GUI 换用 NGUI或者EZGUI;因为这两个UI插件对于UI中的图片处理是将UI图片放置在一个 Atlas 中,一个 Atlas 对应一个Drawcall
3.对于灯光:
可以使用 Unity3D 自带的 Lightmapping 插件来烘焙场景中的灯光效果到物体材质上
4.对于场景:
可以使用 Unity3D 自带的 Occlusion Culling 插件把静止不动的场景元素烘焙出来
5.对于特效:
尽量把材质纹理合并。
Unity对象与DrawCalls的关系
Unity对象与DrawCalls的关系什么是Draw Calls?⾸先我们先来了解⼀下,什么叫做“Draw Calls”:⼀个Draw Call,等于呼叫⼀次 DrawIndexedPrimitive (DX) or glDrawElements (OGL),等于⼀个 Batch。
摸过 DirectX 或 OpenGL 的⼈来说,对 DrawIndexedPrimitive 与 glDrawElements 这 API ⼀定不陌⽣。
当我们准备好资料 (通常为三⾓⾯的顶点资讯) 要 GPU 划出来时,⼀定得呼叫这个函式。
换句话说,如果在画⾯上有⼀张 “⽊" 椅⼦、⼀张 “铁" 桌⼦,那理论上就会有两个 Draw Call。
有看到特别点出 “⽊" 与 “铁" 吗?这代表两物件是使⽤不同材质球或者不同的 Shader。
在 DirectX 或 OpenGL ⾥,对不同物件指定不同贴图或不同 Shader 的描述,就会需要呼叫两次Draw Call。
Procedure code如下:SetShader(“Diffuse");SetTexture(“铁");DrawPrimitive(DeskVertexBuffer);SetShader(“VertexLight");SetTexture(“⽊");DrawPrimitive(ChairVertexBuffer);每次对 Shader 的更动或者贴图的更动,基本上就是对 Rendering Pipeline 的设定做修改,所以需要不同的 Draw Call 来完成物件的绘制。
现在了解为什么 Unity 官⽅⽂件⾥,⽼是要你尽量使⽤同样材质球,以减少 Draw Call 数量了吧!摄像机看到的对象与Draw Calls数值的关系:现象⼀:所以对象都可见,都在摄像机范围内。
Draw Calls:27现象⼆:后⽅的圆球被挡住。
UGUI性能优化之drawcall
UGUI性能优化之drawcall
在unity中,每次CPU准备数据并通知GPU的过程就称之为⼀个DrawCall。
具体过程就是:设置颜⾊-->绘图⽅式-->顶点坐标-->绘制-->结束,所以在绘制过程中,如果能在⼀次DrawCall完成所有绘制就会⼤⼤提⾼运⾏效率,进⽽达到优化的⽬的。
drawcall不是越少越好,如果ui很多,但是drawcall很少,那就是占⽤很多显存宽带,也会导致发热
⼀般都是处理应该合并但是没有合并的ui
Drawcall优化必须先了解⼀下drawcall怎么⽣成,才好优化
Drawcall问题其实可以说同⼀个图集的图形⽹格能否合并的问题(ps:字体其实也是图集)
1.资源适当冗余可以减少drawcall
例如:战⽃界⾯⽤到⼀个公⽤图集的设置按钮,如果我把这个设置按钮复制⼀份到战⽃图集⾥⾯,这样⼦战⽃界⾯能优化⼀次drawcall,对内存和包体影响不⼤
2.图集整理
注意:⼀张图集最好不要超过2048,不然会分成两张图集
3.⼀些复杂的ui适当加canvas
例如:战⽃界⾯和⼩地图都在⼀个canvas⾥⾯,这是这两个界⾯会进⾏合并,这个⼩地图如果有些特殊东西导致战⽃界⾯部分⽆法合并可以试着加个canvas,⽽且⼩地图重建⽐较多,加个canvas也是⽐较稳的
正常来说canvas会增加drawcall,不过有时候遇到复杂界⾯,导致⽆法合并,加个canvas可以减少drawcall
4.屏蔽没必要的raycast也是减⼩性能消耗
5.空的image和透明的image(有⾃带sprite调颜⾊透明)都改掉换成EmptyRaycast。
控制drawcalls,提升性能
控制drawcalls,提升性能⾸先看下⼿机场景要求,明确了要求,就会有问题有针对性drawcalls,控制在100⼀下,同屏不超过2w三⾓⾯。
需要看到远景的⽤LOD,鸟瞰⽤低模。
漫游的话就是1、2层精细点,其它粗糙点。
地图⾯积⼤,得⽤分部加载的。
Drawcalls:这个东西值越⼩,你的游戏性能越好介绍:在游戏中每⼀个被展⽰的独⽴的部分都被放在了⼀个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上呈现出来。
这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地⽅⼀样没什么不同。
你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。
⽬前,真正可怕的事情是从“描绘指令”消耗远景开始,每⼀个独⽴的飞溅到地板上的⾎迹和⼀个⾓⾊或者⼀具死⼫消耗的字节是⼀样的多的。
他们都消耗同样的描绘指令。
除此之外,没有什么更多的差别。
降低DrawCalls:那么如何降低 draw call 呢??那么我们就⽤到Culling(剔除)技术。
如果不应⽤这个技术,电脑是不管3721把场景⾥所有的东西都送去渲染的。
看得见的也渲染,看不见得照样也送去渲染。
很傻是吧,那咋办呢。
得告诉电脑,那个你看得见的渲染,看不见的就算了。
于是就有了1.视锥体剔除(Frustum Culling)这个unity系统⾃带了好像,就不⽤操⼼了。
2.遮挡剔除(Occlusion Culling)Culling的实现对于realtime interactive 3d environment,现实的速度是⾮常重要的,虽然现在的硬件能⼒⾮常的快,但是要想保持30FPS的同时处理数⼗万的三⾓形,以现在的主流机器来说还是⾮常困难的。
为了解决这种问题,⼈们提出了很多⽅法,其中有LOD,有Culling,对于LOD,它可以从2FPS提⾼到10FPS,但是很难从4FPS提⾼到20FPS。
【Unity优化】DrawCall与Batch
【Unity优化】DrawCall与Batch⼀、渲染⼀帧步骤0-1、剔除:摄像机视锥体剔除、代码删除/隐藏Mesh0-2、从硬盘HDD中加载纹理、Mesh到内存RAM,再将需要渲染的加载到VRAM[1]。
1、设置全局 Render State(Unity中对应SetpassCall),包含:顶点/⽚元着⾊器、纹理、材质、光照、透明度等2、CPU发送⼀个DrawCall给GPU,指向VRAM中的⼀个Mesh(不包括材质,这是上⼀步的⼯作)。
3、GPU根据当前 Render State,以及CPU指向的顶点数据,通过代码⽣成像素并显⽰到屏幕。
如果后续Mesh使⽤相同的 Render State,那么重复2、3步骤;否则需要执⾏⼀次1步骤。
步骤3称为管线Pipeline。
管线中从开始到结束,⽐较关键的模块有:顶点着⾊器、光栅化、⽚元着⾊器。
顶点和⽚元着⾊器是可编程的,即常说的Shader。
[1] RAM、VRAM分别存储什么:(1)VRAM:GPU内存仅存储当前帧(DC)需要的资源,⽐如:纹理、mesh、shader、framebuffer、constant buffer、以及其他渲染场景所需的通⽤数据。
处理完当前的DC后,就会清除数据,准备下次DC。
(2)RAM:RAM包含可执⾏代码、⾳频、游戏数据。
⼀般不包含纹理、mesh这些已经在VRAM中的资源(CPU从HDD中读到RAM,传给VRAM,然后从RAM中清除。
然⽽如果需要在CPU中检测碰撞,mesh信息就需要保留)。
(3)RAM、VRAM:动画、物体变换⼀般同时存在。
通常在CPU中每帧更新,然后复制到VRAM中渲染。
⼆、优化概述Render State、DrawCall属于CPU的⼯作,都⽐较耗时。
优化⽅向:降低它们的执⾏次数。
减少 Render State:减少材质的种类减少 DrawCall:不同的Mesh尽量使⽤同⼀个材质;对同种材质的Mesh做合批处理;使⽤GPU Instancing其他优化:避免OverDraw(避免使⽤透明,错误⽰范:为了实现四⾓阴影,使⽤⼀张全屏图⽚)三、优化细节合批分为动态、静态。
【Unity】优化UI(一)
【Unity】优化UI(一)【Unity】优化UI(⼀)Unity UI 优化引导优化Unity UI是⼀门艺术。
⼀快⼀见效的⼀法很罕见,每⼀种情况都必须仔细思考系统的⼀为。
优化UI的关键是平衡draw calls和batching的消耗。
虽然⼀些常⼀的基础可以减少draw calls或batching,但复杂的UI必须通过权衡才能决定使⼀哪种⼀法。
不管怎么说,优化UI应该先从分析(profiling)⼀⼀。
尝试优化UI 最主要的任务是通过观察性能定位到精确的问题。
以下四类问题是Unity UI常见的问题:1. GPU⼀段着⼀器使⼀过度(⼀如fill-rate过度使⼀)。
2. 重建画布批处理(rebuilding a Canvas batch)的CPU时间过多。
3. 重建画布批处理(rebuilding a Canvas batch)次数过多(过度刷新)4. ⼀成顶点(vertices)花费过多的CPU时间(⼀般来⼀Text)原则上,Unity所能创建的UI的性能是受到发给GPU的draw calls的绝对数量的影响的。
在实践中,任何项⼀中的GPU的draw calls问题很⼀可能是受到fill-rate过度使⼀的影响。
这篇⼀章将讨论基础的概念、算法,UI代码,常见问题和相应的解决⼀案。
划分为五个章节:1. Fundamentals of Unity UI 定义Unity UI的术语和讨论许多渲染UI的基础过程,包括打图集。
强烈推荐从这篇⼀章开始看起。
2. Unity UI profiling tools 讨论从各种开发者可以获得⼀具中收集分析数据。
3. Fill-rate, Canvases and input 讨论优化Unity UI的Canvas和Input组件。
4. UI controls 讨论UI Text, Scroll Views和其它特定组件的优化,和⼀些不适合其它地⼀使⼀的技术。
unity优化方案
Unity优化方案概述在开发Unity项目时,为了提供更好的性能和用户体验,我们需要对项目进行优化。
本文将介绍一些常见的Unity优化方案,帮助开发者加速游戏加载速度、提高帧率以及减少内存使用。
1. 静态合并和批处理在Unity中,对象的渲染性能是影响游戏性能的一个重要因素。
为了减少渲染的开销,可以采用以下优化技术:•静态合并:将多个相邻物体合并为一个具有单独材质的大型物体。
这样可以减少渲染调用以及减少顶点和三角形数量。
•物体批处理:将多个具有相同材质的物体合并为一个批次进行渲染。
Unity提供了静态批处理和动态批处理两个层面的优化技术。
这些技术可以通过Unity内置的工具或者使用第三方插件来实现,例如使用Unity自带的静态合并工具,或者使用ProBuilder插件进行静态合并和物体批处理。
2. 纹理优化优化纹理使用可以提高游戏性能,并减少内存使用。
以下是一些纹理优化的方法:•纹理压缩: Unity提供了多种纹理压缩格式,可以根据需求选择适合的纹理压缩格式。
压缩纹理可以减少磁盘空间和内存占用。
•纹理分辨率:使用适当的纹理分辨率可以平衡游戏性能和图像质量。
高分辨率的纹理会增加GPU的工作负荷,影响游戏的帧率。
可以通过在Unity的Inspector窗口中设置纹理压缩格式和分辨率来优化纹理。
3. 垃圾回收和内存管理垃圾回收和内存管理是保持游戏性能稳定的关键。
以下是一些优化内存的方法:•对象池:对象池是一种重复使用游戏对象的技术,可以避免频繁地创建和销毁对象,减少垃圾回收的开销。
•避免内存泄漏:确保在不再使用的时候及时释放资源和引用,避免内存泄漏。
•使用GC Alloc和Profiler工具:Unity提供了GC Alloc和Profiler工具来帮助开发者检测和优化垃圾回收和内存使用问题。
4. 脚本优化游戏脚本的性能优化也是提高游戏性能的重要一环。
以下是一些脚本优化的方法:•避免频繁的调用重复操作:比如使用InvokeRepeating代替Update函数进行定时操作,避免每帧都进行重复操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成都龙图教育:Unity中Draw Call的性能优化
Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),索引(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader 决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像。
在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。
这一过程是逐个物体进行的,对于每个物体,不只GPU的渲染,引擎重新设置材质/Shader 也是一项非常耗时的操作。
因此每帧的Draw Call次数是一项非常重要的性能指标,对于iOS来说应尽量控制在20次以内,这个值可以在编辑器的Statistic窗口看到。
Unity内置了Draw Call Batching技术,从名字就可以看出,它的主要目标就是在一次Draw Call中批量处理多个物体。
只要物体的变换和材质相同,GPU就可以按完全相同的方式进行处理,即可以把它们放在一个Draw Call中。
Draw Call Batching 技术的核心就是在可见性测试之后,检查所有要绘制的物体的材质,把相同材质的分为一组(一个Batch),然后把它们组合成一个物体(统一变换),这样就可以在一个Draw Call中处理多个物体了(实际上是组合后的一个物体)。
但Draw Call Batching存在一个缺陷,就是它需要把一个Batch中的所有物体组合到一起,相当于创建了一个与这些物体加起来一样大的物体,与此同时就需要分配相应大小的内存。
这不仅会消耗更多内存,还需要消耗CPU时间。
特别是对于移动的物体,每一帧都得重新进行组合,这就需要进行一些权衡,否则得不偿失。
但对于静止不动的物体来说,只需要进行一次组合,之后就可以一直使用,效率要高得多。
Unity提供了Dynamic Batching和Static Batching两种方式。
Dynamic Batching是完全自动进行的,不需要也无法进行任何干预,对于顶点数在300以内的可移动物体,只要使用相同的材质,就会组成Batch。
Static Batching则需要把静止的物体标记为Static,然后无论大小,都会组成Batch。
如前文所说,Static Batching 显然比Dynamic Batching要高效得多,于是,Static Batching功能是收费的……
要有效利用Draw Call Batching,首先是尽量减少场景中使用的材质数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中(称为
Texture Atlasing)。
然后是把不会移动的物体标记为Static。
此外还可以通过CombineChildren脚本(Standard Assets/Scripts/Unity
Scripts/CombineChildren)手动把物体组合在一起,但这个脚本会影响可见性测试,因为组合在一起的物体始终会被看作一个物体,从而会增加GPU要处理的几何体数量,因此要小心使用。
对于复杂的静态场景,还可以考虑自行设计遮挡剔除算法,减少可见的物体数量同时也可以减少Draw Call。
总之,理解Draw Call和Draw Call Batching原理,根据场景特点设计相应的方案来尽量减少Draw Call次数才是王道,其它方面亦然。
想要学unity 3d的童鞋可以来龙图教育,龙图教育是一家专业做互联网教育品牌的教育机构,线上线下都有,想要学到更多有关unity 3d 的知识可以直接访问龙图教育官网。
联系扣扣:318-961-3107。