unity spriterendererkeletonrenderer 怎么优化

unity3d优化(19)
&官方优化文档--优化图像性能
&&&&&&/Documentation/Manual/OptimizingGraphicsPerformance.html
&&&&&&Unity3D性能优化专题
&&&&&&&性能优化是一个异常繁琐而又涉及到项目开发的方方面面的一个过程,它的本质是在运行时的一个时间里尽可能完美展现丰富的内容。
&&&&&&&实现优化可以通过优化资源、渲染、粒子、物理等模式;
&&&&&&也可以通过修改模型大小、减少纹理尺寸并结合Unity3D的一些相关特性来提升游戏的性能。
&&&&&&&随着移动端的设备硬件能力的提升,如何使用尽可能优化的资源和程序效率来展现出更多的细节内容就成为了每个开发者都应该思考的内容,这也使得优化变成了项目开发中非常重要的一环。
&&&&&&***********
&&&&&&首先介绍下draw call(这个东西越少你的游戏跑的越快):
&&&&&&在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。
&&&&&&那么如何降低 draw call 呢??那么我们就用到Culling(剔除)技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你
&&&&&&看得见的渲染,看不见的就算了。于是就有了
&&&&&&1.视锥体剔除(Frustum Culling)这个unity系统自带了好像,就不用操心了。
&&&&&&2.遮挡剔除(Occlusion Culling)
&&&&&&Unity 3专业版内置了一个强大的 Occlusion Culling 插件 Umbra免费的
&&&&&&遮挡剔除(Occlusion Culling)&
&&&&&&遮挡剔除是一种什么样的特性呢, 当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。. 遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染,无效渲染&overdraw&). 遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内.
注意当你使用遮挡剔除时你依然受益于视锥体剔除(Frustum Culling).
&&&&&&***********
&&&&&&&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时间。特别是对于移动的物体,每一帧都得重新进行组合,这就需要进行一些权衡,否则得不偿失。但对于静止不动的物体来说,只需要进行一次组合,之后就可以一直使用,效率要高得多。 - See more
at: /blog//unity-optimization-of-draw-call/#sthash.0WfH4KnX.dpuf
&&&&&&***********
&&&&&&输出设置相关:
&&&&&&1:最终输出的时候,在unity - edit - project setting - player 里, 把 other settings - script call optimization 改成 快速, 但没有例外. fast but no exceptions
&&&&&&2: unity - edit - project setting - time 里, 把 maximum allowed timestep 改成0.1
&&&&&&常规优化
&&&&&&1: 联结(combine)优化
&&&&&&&显卡对于一个含100个面片的物体的和含1500个面片的物体的渲染消耗几乎是等价的。所以如果你有N个同一材质的东西,那么把他们联成同一个物体再统一用一个material那么对于显卡的渲染消耗就要降低N倍。
&&&&&&在unity里再联结,这个要怎么做呢,其实也挺简单的,经常看Island Demo项目的人应该很早就注意到里面的石头这些都是连在一起的,原因就在这里,他提供了现成就脚本实现联结。
&&&&&&&先到Island Demo的Assets/Script下找到CombineChildren.cs和MeshCombineUtility.cs两个脚本复制到自己的项目文件(我们要用的只是前者,但他会调用后者,没有后者unity会报错,所以把后者扔到项目里不管就好)
&&&&&&然后把你项目里那些用同一Materials的东西扔到一个空物体里面去,再把CombineChildren.cs贴到那个空物体上,搞定!
&&&&&&2: 模型
&&&&&&(1)只用一个mesh renderer, 少用多materials, 最多3个
&&&&&&每个角色尽量使用一个 Skinned Mesh Renderer
&&&&&&这是因为当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。
&&&&&&(2)模型骨骼不超过30个.
&&&&&&(3)尽量减少面 300-1500
&&&&&&(4)模型尽量不要分开, 如果多个模块, 会多次调用dc
&&&&&&(5)一般角色应该没有 IK 结点
&&&&&&这是因为角色的动作大多数都是事先设定好的,并不需要经过 IK 操作来进行实时计算( Rogdoll 除外),所以在模型导入时,不要将 IK 结点一起导入。
&&&&&&(6) 不要附加 Animation Component 在静态实体上附加 Animation 部件虽然对结果没有影响,但却会增加一定的 CPU 开销来调用这一组件,所以尽量去掉该组件。
&&&&&&3:尽量不用像素光(pixels Lights)
&&&&&&4:不用 软阴影(soft shadow), 或者不用阴影(No Shadows)
&&&&&&&灯光能不用就不用, 阴影可以用面来代替.
&&&&&&5:少用实时灯光, 尽量使用lightmap
&&&&&&.cn/s/blog_409cc4b00100no8y.html
&&&&&&动态实时灯光相比静态灯光,非常耗费资源。所以除了能动的角色和物体(比如可以被打的到处乱飞的油桶)静态的地形和建筑,通通使用Lightmap。
&&&&&&强大的Unity内置了一个强大的光照图烘焙工具Beast,这个东东是Autodesk公司的产品
&&&&&&6:transform和OnGUI (运算上的优化远比不上 绘制效率上的优化,少个dc可能就比得上这些了)
&&&&&&//unity%E6%80%A7%E8%83%BD%E5%84%AA%E5%8C%96%E4%B9%8B%E5%B0%8F%E6%B8%AC%E8%A9%A6/
&&&&&&// transfrom
&&&&&&少用transform, 多用 myCachedTransform
&&&&&&頻繁使用該物件的地方,就是先把該物件cache起來,理論上就會避免這種不必的開銷。
&&&&&&※這也可延伸至其他是property的變數。例如:transform.position。
&&&&&&***直接使用的版本:
&&&&&&public class TestUnit : MonoBehaviour
&&&&&&&void Update()
&&&&&&&var t = this.
&&&&&&&t = this.
&&&&&&&t = this.
&&&&&&&t = this.
&&&&&&&t = this.
&&&&&&***cache 使用的版本:
&&&&&&public class TestUnit : MonoBehaviour&
&&&&&&&Transform myT
&&&&&&&void Start()
&&&&&&&myTransform =
&&&&&&&void Update ()
&&&&&&&var t = this.myT
&&&&&&&t = this.myT
&&&&&&&t = this.myT
&&&&&&&t = this.myT
&&&&&&&t = this.myT
&&&&&&// OnGUI
&&&&&&空物件版本:
&&&&&&public class TestUnit : MonoBehaviour
&&&&&&外加一個空白OnGUI的版本:
&&&&&&public class TestUnit : MonoBehaviour
&&&&&&&void OnGUI()
&&&&&&&{ }
&&&&&&實際上是被GUI.Begin()和GUI.End()所佔據,function本身是無辜的~~
&&&&&&非必要避免使用OnGUI(),即使它裡面甚麼事情都沒做!
&&&&&&如需使用,請盡可能集中到同一個OnGUI()底下執行繪製,好避免Begin End的開銷。
&&&&&&7:动态物体的相关优化
&&&&&&优化主要分为两个方向,一个是资源相关优化和引擎相关的优化。资源相关的优化,大概分为动态物体、静态物体、纹理数据、音频数据、程序包数据。对于动态物体比如NPC、怪物等,需要对面片数量的控制,大概在300到2000面。1500面就可以体现人物细节,但如果是人物比较多,可能要降低面数,不要低于300。另外,一方面是控制Skinned Mesh Renderer的数量;另一方面是控制材质数量在1到3种。人物最好用小于30根骨骼,如果你用的骨骼越多,耗费的CPU就更多,所以在移动平台上尽量少于30根。现在我们看其他动态物体,利用Dynamic
Batching进行合批。这个下雨特效并不是系统做的,是包含很多雨点的网格进行重复拷贝,然后错乱移动实现的。每一个雨点并不是一个粒子,这样能减少很多CPU的消耗,每一个整体网格都会有一个顶点的控制,通过控制顶点数量,对系统实现雨点效果来说,这是一个相当省时省力的方法。
&&&&&&8:静态物体的相关优化
&&&&&&下面我们来看静态物体,静态物体也是要控制面数和顶点数,顶点数少于500个。static是不会进行移动缩放、旋转的,把它标记为static,当然他们的材质是一样的。不要添加animation组建,对于静态物体来说,这个组件毫无意义,能把他丢掉就丢掉,因为这对CPU的消耗是非常客观的。
&&&&&&9:音频程序的优化
&&&&&&关于音频时间的播放,比如背景音乐,建议使用MP3压缩格式,比如音效,要求数据尽快加载,这些数据比较小就可以,使用WAV和AIF未压缩音频格式。关于程序包的优化,很多开发者会埋怨说打出来的包太大,现在介绍减少程序包的方法,首先使用压缩格式的纹理,以显卡的压缩格式保存,使用压缩网格和动画数据。网格压缩是先采用量化处理,当然这个压缩是保证在包里面的数据小,但运行时占用的内存没有减少,因为我们并没有把顶点删除,但是对动画数据来说,动画数据经过压缩处理后降低,可以减少游戏列层。
&&&&&&关于代码尽量不要使用System.xml,我们建议使用Mono.xml。启用Stripping来减少库的大小,使用剥离方式。
&&&&&&10:引擎相关优化和物理相关优化
&&&&&&下来是引擎相关的优化,例如光照设置、相继设置、粒子特效、物理特效等。那拿光照设置来说,光源全部的实时光照这是很恐怖的,每一次实施光照代表着每一次使用消耗,怎么优化?有人使用LightMapping来制作静态场景,他的好处是不需要用多张实施光照,而给场景很好的光照效果。有人使用Light Probes代替实时光照,好处是完全不用怎么消耗,而且运作性能也非常高。在有些时候使用Light Probes代替光照,他能跟场景很好的融合,在一个角落里,这个任务会被阴影打得暗一些。如果说场景中确实需要一些实时光源,那么肯定是需要做过优化设置的实时光源,控制important的光源个数。如果说光源有些地方产生了交叉光,这个时候你可以通过设置Pxel
Light,控制每一个光源都只接受一个动态光照,数目大概是1—2个。对于关闭光源的实时阴影,并不是所有平台都支持实时阴影,消耗也非常大,不建议大家使用。关于相机方面的设置,平面越近,渲染越少。我们更建议使用分层,比如远处的建筑,对于建筑物的裁减平面远一些,如果是花草,就可以使用平面就近一些。现在看一下粒子特效,粒子也是游戏中需要优化的东西,建议屏幕中最大的粒子数不要超过200,同时每个发射器发射的最大粒子数不要超过50。粒子尺寸也要尽可能小,最终在屏幕有多少像素。他们中间的像素可能会被渲染很多次,至少四五次,这时发现粒子系统仅像素就填充了更多屏幕,这时候对游戏来说非常耗费,对游戏的其他功能性能也有所影响。另外一方面,对于非常小的粒子,尽量不要开启粒子碰撞功能。
&&&&&&现在我们看一下物理相关优化,物理尽可能使用Sphere Coillider、Box Coillider等,尽量避免使用Meh Colllider等。渲染设置,避免使用Alpha Test,因为非常耗时,性价比很低。关于Sttic Batching,对静态物体进行Batch,对几何数据的大小没有限制。物体被合并后会带来一些内存消耗,比如说有控制网格的物体,用Batch会合并成大物体。Dynamic Batching目前仅支持小于900顶点的网格物体。如何理解900呢,其实就相当于900个顶点数据大小的物体,如果说使用Position、Normal和UV三种属性,那么你只能Batch300个顶点。整体缩放的物体不能被Batch,除非他们的缩放值相同。之前有一个客户做特效,使用Batch机制把面片合并,最终让所有面片共享一个纹理,这时候发现这些面片没有被Batch出来,导致运行游戏时大概放三个技能就10多个招套。对于非整体用户体,他们的Batch是需要很好利用到。
&&&&&&11:纹理合并优化
&&&&&&现在来看纹理合并,纹理合并就是为了特到Batch数量,合并物体首先需要合并工具,还要修改使用纹理的网格的UV,使他们使用纹理。合并纹理主要是参照Batch,提高渲染性能。但在合并材质后需要注意的是脚本访问Renderer被拷贝。/*安挡剔除,建议使用PVS技术。建议大家使用自定义shader,例如高光效果,高光效果可能不需要做一些入射线的检测,只是简单把他的值放大也可以模拟高光效果,从而减少一些消耗。
&&&&&&另外一个是用profiler,通过他给的数据进行针对性的优化。以上是跟大家介绍优化的内容,如何作出良好优化,一定要做好良好的规划,到后期就不会很麻烦,如果规划没有做好有可能会给程序带来很大压力,结果可能很不乐观。*/最后,要不断实验不断总结才能达到自己满意的效果。
&&&&&&要想降低Drawcal的话,有如下两点小建议
&&&&&&(1)不要用Unity自带UI或者iGUI, 用NUI 或者EZ GUI
&&&&&&(2)创建好的GameObject不用了就最好及时 删除 / 设置active为false/移出屏幕 。 这几种方法都可以去掉该物体导致增加的Drawcall
&&&&&&*********************************
&&&&&&*********************************
&&&&&&*********************************
&&&&&&最近一段时间一直在做Unity 在IOS设备上的资源优化,结合Unity的官方文档以及自己遇到的实际问题,我把自己认为一些重要的信息罗列在下面,并尽可能对将其量化,以方便更多需要做优化的朋友。
&&&&&&1、 角色
&&&&&&每个角色尽量使用一个 Skinned Mesh Renderer
&&&&&&这是因为当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。
&&&&&&角色 Material 数量
&&&&&&2-3 个
&&&&&&骨骼数量
&&&&&&小于 30 个
&&&&&&面片数量
&&&&&&300-1500
&&&&&&一般角色应该没有 IK 结点
&&&&&&这是因为角色的动作大多数都是事先设定好的,并不需要经过 IK 操作来进行实时计算( Rogdoll 除外),所以在模型导入时,不要将 IK 结点一起导入。
&&&&&&2、 静态实体
&&&&&&不要附加 Animation Component
&&&&&&在静态实体上附加 Animation 部件虽然对结果没有影响,但却会增加一定的 CPU 开销来调用这一组件,所以尽量去掉该组件。
&&&&&&网格顶点数
&&&&&&小于 500
&&&&&&UV 值范围尽量不要超过( 0, 1 )区间
&&&&&&尽量保证 UV 值不越界,这对于将来的纹理拼合优化很有帮助。
&&&&&&3、 地形
&&&&&&地形的分辨率大小
&&&&&&长宽均尽量小于 257 。这是因为地形太大,会造成大量顶点数据,给你的内存带宽造成一定的影响,在目前的 ios 设备中,内存带宽是非常有限的,需要尽量节省。同时,如果用 Unity 自带的地形,一定也要使用 Occlusion Culling ,因为 Unity 的刷地形工具虽然方便,但却是 framekiller ,刷过之后,你会发现 drawcall 增加的非常多。
&&&&&&混合纹理数量
&&&&&&不要超过 4 。地形的混合操作是很耗时的,应该尽量避免。能合并的纹理尽量合并。
&&&&&&4、 纹理
&&&&&&纹理格式
&&&&&&建议 png 或 tga 。不用转成 ios 硬件支持的 PVRTC 格式,因为 Unity 在发布时会帮你自动转的。
&&&&&&纹理尺寸
&&&&&&长宽小于 1024 。同时应该尽可能地小,够用就好,以保证纹理对内存带宽的影响达到最小。
&&&&&&支持 Mipmap
&&&&&&建议生成 Mipmap 。虽然这种做法会增加一些应用程序的大小,但在游戏运行时,系统会根据需求应用 Mipmap 来渲染,从而减少内存带宽。
&&&&&&检查 Alpha 值
&&&&&&如果纹理的 alpha 通道均为 1 ,则用 RGB 的 24 位纹理来代替 RGBA 的 32 位纹理。(据说 Unity 内部会进行自动检测)
&&&&&&5、 光源
&&&&&&光源“ Important ”个数
&&&&&&建议 1 个,一般为方向光。“ Important ”个数应该越小越少。个数越多, drawcall 越多。
&&&&&&Pixel Light 数目
&&&&&&1-2 个。
&&&&&&6、 粒子特效
&&&&&&屏幕上的最大粒子数
&&&&&&建议小于 200 个粒子。
&&&&&&每个粒子发射器发射的最大粒子数
&&&&&&建议不超过 50 个。
&&&&&&粒子大小
&&&&&&如果可以的话,粒子的 size 应该尽可能地小。因为 Unity 的粒子系统的 shader 无论是 alpha test 还是 alpha blending 都是一笔不小的开销。同时,对于非常小的粒子,建议粒子纹理去掉 alpha 通道。
&&&&&&尽量不要开启粒子的碰撞功能。
&&&&&&非常耗时。
&&&&&&7、 音频
&&&&&&游戏中播放时间较长的音乐(如背景音乐)
&&&&&&使用 .ogg 或 .mp3 的压缩格式。
&&&&&&&较短音乐(如枪声)
&&&&&&使用 .wav 和 .aif 的未压缩音频格式。
&&&&&&8、 相机
&&&&&&裁剪平面
&&&&&&将远平面设置成合适的距离。远平面过大会将一些不必要的物体加入渲染,降低效率。
&&&&&&根据不同的物体设置不同的远裁剪平面
&&&&&&Unity 提供了可以根据不同的 layer 来设置不同的 view distance ,所以我们可以实现将物体进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,另外,一些开销比较大的实体(如粒子系统)可以设置得更小些等等。
&&&&&&9、 碰撞
&&&&&&尽量不用 MeshCollider
&&&&&&如果可以的话,尽量不用 MeshCollider ,以节省不必要的开销。如果不能避免的话,尽量用减少 Mesh 的面片数,或用较少面片的代理体来代替。
&&&&&&10、 其他
&&&&&&Drawcall
&&&&&&尽可能地减少 Drawcall 的数量。&
&&&&&&iOS 设备上建议不超过 100 。
&&&&&&减少的方法主要有如下几种: Frustum Culling , Occlusion Culling , Texture Packing 。
&&&&&&Frustum Culling 是 Unity 内建的,我们需要做的就是寻求一个合适的远裁剪平面; Occlusion Culling ,遮挡剔除, Unity 内嵌了 Umbra ,一个非常好 OC 库。但 Occlusion Culling 也并不是放之四海而皆准的,有时候进行 OC 反而比不进行还要慢,建议在 OC 之前先确定自己的场景是否适合利用 OC 来优化;
&&&&&&Texture Packing ,或者叫 Texture Atlasing ,是将同种 shader 的纹理进行拼合,根据 Unity 的 static batching 的特性来减少 draw call 。建议使用,但也有弊端,那就是一定要将场景中距离相近的实体纹理进行拼合,否则,拼合后很可能会增加每帧渲染所需的纹理大小,加大内存带宽的负担。
&&&&&&这也就是为什么会出现“ DrawCall 降了,渲染速度也变慢了”的原因。
&&&&&&非运动物体尽量打上 Static 标签
&&&&&&Unity 在运行时会对 static 物体进行自动优化处理,所以应该尽可能将非运行实体勾上 static 标签。
&&&&&&场景中尽可能地使用 prefab
&&&&&&尽可能地使用 prefab 的实例化物体,以降低内存带宽的负担。检查实体的 PrefabType ,尽量将其变成 PrefabInstance ,而不是 ModelPrefabInstance 。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80224次
积分:1347
积分:1347
排名:千里之外
原创:43篇
转载:67篇
评论:18条
(13)(7)(1)(7)(5)(3)(3)(1)(1)(14)(17)(18)(10)(7)(1)(2)扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 752|回复: 1
如何在Unity中优化游戏声音和加速游戏?
7排名<font color="#FF昨日变化2主题帖子积分
在线时间110 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
How ToOptimize Game Sound In Unity And Boost Your Game 如何在Unity中优化游戏声音和加速游戏?Objective
The mainobjective of this blog post is to give you an idea about Unity Games A BigPerformance Boost By Optimizing Sounds这篇博客文章的主要目的是给你概述如何通过优化音乐来提高Unity游戏性能。
This blog post is part of our ongoing Latest Optimization Initiative for UnityGames.我们正在为Unity游戏进行最新的初始化优化,这篇博客文章是其中的一部分。
If you would like to learn how tooptimize your games, you can check out this blog post:如果你想去学习怎么优化你的游戏,你可以看看这篇博客文章:
·&&Latest Optimization Initiative for UnityGames 最新的初始化优化
Why is my game loading time so high?为什么我游戏加载的这么慢呢?
Why is there a big lag while playinggame sounds?为什么播放游戏声音的同时会存在很多的延迟?
Why are sound files taking so muchmemory?为什么声音资源文件占用这么多的内存?
Why do I see some lag/delay in the gamewhile playing sounds?为什么在播放声音的同时看到有些滞后或不能及时播放?
Am I mishandling sounds in my game?我的游戏声音是不是失去了控制?
Yes, sounds can be a big headache!Imagine you are on a deadline and it’s almost launch time, you have finallydecided to integrate sounds in your game. Now when the sounds are ready, timeto build!是的,声音的确是一个令人头痛的!想象一下在最后截止期限,几乎就是它快要被发布的时间,你终于决定在游戏中整合声音。现在,声音资源准备好了,是时间去创建了!
Then comes the Oh #@%# moment! (Don’tforg) )You have all loads of sound questionsjust like the ones above, running all over your mind!所有关于声音加载的问题,就像上面的那些,都在你头脑里!& && && &
Yes, I know that feeling! Sounds ca I had the same issue while developing my first game. I couldnot find any reason or solution behind this issue anywhere on the Internet. SoI decided to put this blog post up here that might help you.是的,我知道那种感受!声音的管理是一个棘手的问题;当我开发第一个游戏时,我也有同样的问题。在网上的任何地方,我都找不到原因或是解决方法。所以,我决定把这篇博客文章放出来,也许可以帮到你们。
If you are new to Unity, you need tofirst get the clear idea of how audio management works in Unity.如果你是Unity新手,你必须首先了解清楚声音管理器是如何工作的。
For this, you can refer the following link that will give you a basic ideaof Audio Clips, Audio Listeners and Audio Sources.对于此,你可以参考以下链接里的内容,这将会让你对Audio Clips,,Audio Listeners以及Audio Sources有一个基本的了解。·&&
AUDIO MANAGEMENT IN UNITY IS QUITE SIMPLE AND BASIC,Unity中的音频管理是非常简单、基本的,
SO HOW DOES IT AFFECT MY GAME? 所以它到底是怎样影响我的游戏的?
·&&Yes, it’s quite simple, but it has the power to make your game go intoa coma!·&&是的,它看起来非常简单,但是它有能力让你的游戏陷入瘫痪状态。
·&&To understand this let’s take a simple example.·&&为了明白这个,让我们做一个小案例吧。
Step 1) Setup Scene as Below:步骤1)设置场景如下:
·&&Take a canvas with two buttons (one MusicButton, the other SoundButton). Take twoAudio Sources. Take an Empty Game Object named SoundManager. (You can nameit as per your needs).·&&创建一块画布,并在其上方添加两个按钮(一个MusicButton、另外一个是SoundButton)。添加2个声音源文件,创建一个空的游戏对象,并命名为SoundManager。
Set the hierarchy as shown below:Hierarchy面板的设置如下图所示:My screen setup is simple as shown below (Just to give you an idea):我的屏幕设置和下图所演示的一样简单(仅供你参考):
Step 2) Setup the Following Script:步骤2)设置下面的脚本:
·&&public class SoundManager : MonoBehaviour·&&{·& && &#region BACKGROUND_MUSIC·& &·& && &public AudioClip[] backgroundMusicClipsA·& && &public AudioSource backgroundMusicS·& &·& && &#endregion·& &·& && &#region SFX_SOUNDS·& &·& && &public AudioClip[] SFXS·& && &public AudioSource SFXAudioS·& &·& && &#endregion·& &·& && &#region PUBLIC_METHODS·& &·& && &public void PlayRandomMusic()·& && &{·& && && & backgroundMusicSource.clip =backgroundMusicClipsArray[Random.Range(0,backgroundMusicClipsArray.Length)];·& && && & backgroundMusicSource.Play();·& && &}·& &·& && &public void PlayRandomSFXSounds()·& && &{·& && && & SFXAudioSource.PlayOneShot(SFXSounds[Random.Range(0, SFXSounds.Length)]);·& && &}·& &·& && &#endregion·&&}
So here I took two Arrays of AudioClips named backgroundMusicClipsArray() and SFXSounds() for background music and SFX sounds respectively.所以在这里,我用了2个 AudioClips数组来表示背景音乐以及SFX音乐,分别命名为backgroundMusicClipsArray()和 SFXSounds()。
Also two AudioSource for the same.两个AudioSource也是分别表示背景音乐以及SFX音乐
Here PlayRandomMusic() and PlayRandomSFXSounds() will play random Music/ Sound when called. Link these methods to thebuttons in the scene as per their respective names. Keep all AudioClips settingas default在这里,调用PlayRandomMusic()和PlayRandomSFXSounds()函数时,可以随机播放声音。将这些方法链接到场景中的按钮上,并保持所有的 AudioClips 设置为默认值
Now test it in the editor if it’s working properly.现在,在编辑器中测试它是否正常工作。
Step 3) Prepare an
Build:步骤3)准备编译成一个安卓版本:
build and do not forget to check mark Development Build and Auto Connect Profiler.生成Android版本,不要忘记选择Development Build和 Auto Connect Profiler 。
·&&&Start the game on your phone. Do you notice anything weird?&·&&在手机上开始玩游戏。你注意到有任何怪异的事情吗?
·&&&How much time did it take to load the game?&·&&它加载游戏要花多长的时间?
In my case, it took about 10-15 seconds to load out from the Unity’s default splash screen! I have about 15 background music audio clips and about 40 odd SFX sound clips.在这个案例中,从Unity默认启动画面开始,它大约花了10-15秒完成加载!我大约有15首背景音乐的音频片段以及40首奇怪的SFX音乐片段。
Now check the profiler, move to the Audio part of the profiling.现在来查看分析器,移动到分析器中关于声音的那部分。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gifCheck out the &Total Audio Memory& indicator that shows about 145MB...! In short Audio is taking about 145 MB of memory alone. So mobiles with RAM less than 512 MB would struggle to keep your game going!检查&Total AudioMemory&指标,它显示为145 MB......!简单来说,仅音频这一项就占用差不多145 MB的内存。所以,内存低于512 MB 的手机想要让游戏顺畅的运行,那是很艰难的。
OKAY, I ACCEPT THAT AUDIO IS TAKING TOO MUCH MEMORY!好的,我明白了这个音频会占用很多的内存。
BUT HOW CAN I CONTROL THAT?但是我要怎样才能控制它呢?
There is always a solution! But here the question is,总是会存在解决办法的。但是问题是,
·&&“Is It the best and optimized one?”·&&它是最好的、已经优化好了的吗?
To get the answer let us take certain steps and continue with our example为了得到答案,让我们采取进一步的措施,继续我们的例子
Step 1) Perform a few setting tweaks OnAudio Clips第 1 步)在Audio Clips上进行一些设置上调整
To understand this step better, first go through the following link thatexplains different settings of AudioClips (Proper understanding is required for optimization purpose)为了更好地理解这一步,先参考参考下面的链接,它解释了不同设置下的AudioClips (适当的理解是优化目的所要求的)·&&
Now select all looping background music clips.现在选择所有的循环背景音乐片段。
Inspector will show settings just likethe image below:Inspector设置参数就像下面图片所展示的一样:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gifAs seen in the above image lets de-select Preload Audio Data. Check mark Override for Android and set Load Type as Streaming.就像和上面图片中看到的一样,没有选择Preload AudioData 。选中Override forAndroid 并且设置Load Type为Streaming 。
&If you have read the above linkproperly, you might already know why I am doing this. :D&如果你已经充分阅读了上面的链接,你可能已经知道我为什么这样做了。
Step 2) Prepare Audio Build第2步)准备声音的创建
Follow all Building steps just like before.像以前一样遵循所有的创建步骤。
Did you mark any difference?你有注意到有什么差别吗
In my case, the game loading time went down from 15 seconds to 2 seconds...! That is about 5-7 times faster loading time...!在我例子中,游戏的载入时间从15秒下降到2 秒!加载时间大约快了 5-7倍!注意:
This might differ from device to device, depending upon CPU and just to give you a heads up I use &Motorola MOTO G2&这可能因设备不同而不同,取决于CPU和内存的功耗;只是给你提个醒,我用“Motorola MOTO G2”
Now let’s check the profiler.现在,让我们查看分析器。
Do you see some change here?你有看到一些不同的地方吗?
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gifTotal Audio memory went down from 145 odd MBs to 5.8 MBs that too without deleting a single audio clip!!! That is 25 times optimized memory usage!!在一个音频都不删除的情况下,音频占用的内存从145下降到5.8!这节约了25倍的内存使用!
OHH THAT’S FANTASTIC!! BUT WHAT, HOW, WHY…!哇哦,太棒了!但是,什么,如何,为什么…!
You already know HOW! It’s all about why!你已经知道如何实现的!下面都是关于为什么这样做!
Here we di hence, there was no need for the device to preload all audio clips at the start, hence the faster loading time! Audio Clips will only be loadedin a memory as and when they are required.在这里,我们禁用预加载音频。因此,在开始的时候,不需要设备预加载所有的音频片段,这样加载时间就更短了!音频片段只会在需要用到的时候,才被加载在一个内存中。
But the question here in your mind might be, &Once I load and use all audio clips, would they not holdall of the memory?&但在你的脑海中可能出现的问题是,“一旦加载和使用所有的音频片段,他们不会占用所有的内存?”
If you remember I had set Load Type as streaming, so this will buffer the audio clip on the go and will beplayed from it. Once the buffer is played, it will be unloaded hence freeing upthe memory. Thus resulting in optimized memory usage!如果你还记得我曾设置Load Type 为streaming ,所以这将在运行时缓冲音频片段。一旦这个音频缓冲区被播放完了,缓存区将因此卸载并释放内存。由此而引发内存优化 !
Other Question that you might be having “Why not do the same for SFX audios?”你可能遇到其他问题“SFX声音为什么不同样这样做呢?”
Well because they are used very frequently during gameplay, hence minordelay in that audio would not feel correct. In fact, I would recommend setting Load Type as Decompress on Load for faster execution (not for all, justfor the very frequent ones).好,在玩游戏期间非常频繁地使用他们,因此会产生轻微延迟,这使音频听起来不对。 事实上,我会建议将Load Type 设置为 Decompress onLoad (并不是全部,只是针对用的非常频繁的),这样执行速度更快。
Anyways even if you have about 50 SFX sounds, it would not take more thana 10-20mb of memory, which is acceptable.不管怎么说,即使你大约有50 个SFX 声音,它占用的内存也不会超过 10-20 mb,这些是可以接受的。
Following image shows about 40 SFX AudioClips Load Type Set as Decompress on Load and still taking just about 16 mb, which is good enough imo!下图展现了大约40个SFX声音片段,它的负载类型设置为Decompress on Load , 这样仍然只占用 16 mb左右的内存!
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.gifTHIS REALLY HELPS! SOUND OPTIMIZATION IS A NECESSITY!这真的有帮助!声音优化是一种必要性!
Yes, it’s a necessity.是的,这是必要的。
If we are able to optimize soundsproperly, we leave quite a lot of memory for other important gameprocesses and hence create a mobile friendly game. Proper synchronizationwith a game is also important. So optimized and proper settings are a must,which can only be achieved only with proper understanding.如果我们能够正确地优化声音,那么给游戏其他的过程留下了相当多的内存,从而创建一个友好的。符合要求的同步游戏也很重要。因此,优化和适当的设置是必须的,只有正确的理解才能实现。
If you still have any doubts or queriesfeel free to post a comment down below, I will get back to you as soon aspossible. And we accept suggestions as well! We would be happy to learn newtechniques as well. And stick with us as we are going to upload more blog postsvery soon!如果你有任何疑问或问题,可以随时在下面发表评论,我会尽快回复你的。我们也会接受你的建议,我们会很高兴地学习新技术。坚持关注我们,很快我们将上传更多的博客文章!
Till then you can also check &Music Visualization in Unity& which might interest you.到那时,你也可以查看&Music Visualization in Unity&这一块,也许你会感兴趣。
This blog post is part of our ongoing Latest Optimization Initiative for UnityGames.这个博客文章是我们正在对Unity游戏进行的最新优化计划的一部分。
If you would like to learn how tooptimize your games, you can check out this blog post:如果你想要学习怎么优化你的游戏,你可以查看这篇博客:
·&&Latest Optimization Initiative for UnityGamesI hope you find this blog post very helpful while working with SoundOptimization in Unity. Let me know in comments if you have any questionregarding Unity, I will reply ASAP.我希望当你在Unity中优化声音时,会发现这篇博客文章是很有帮助的。关于Unity如果你有任何问题,你可以在评论里告诉我,我会尽快回复。
Got an Idea of Game Development? What are you still waiting for? Contact us now and see the Idea live soon. Our company has been named as one of thebest Unity 3D Game Development Company in India.有一个开发游戏的想法?你还在等什么?联系我们,很快就能看到你的想法被实现出来。我们公司已被评为印度市最好的3D游戏开发公司之一。
每日推荐:
71500/5000排名<font color="#FF昨日变化3主题帖子积分
日久生情, 积分 1500, 距离下一级还需 3500 积分
日久生情, 积分 1500, 距离下一级还需 3500 积分
蛮牛币1795
在线时间513 小时
没有里面说的图片啊!
每日推荐:
经过游戏蛮牛认证的蛮牛小翻译

我要回帖

更多关于 unity canvasrenderer 的文章

 

随机推荐