
Unity 性能精讲
独立游戏开发指南
这个作者很懒,什么都没留下…
展开
-
Unity3D :关于UGUI的网格重建、动静分离
前言:无论是网上的攻略还是以前的经验来说,都说UGUI需要进行动静分离。也就是说同一个界面下的UI,可活动的元素放在一个Canvas下,不可活动的元素放在另一个Canvas下。虽然两个Canvas打断了合批,但是却减少了网格的重建时间,总体上是有优化的。究其原因,是因为在同一个Canvas下的某个元素发生变化时,同一Canvas下的所有元素都会进行网格重建(ReBatch)。而静态的元素在...转载 2019-03-18 17:09:26 · 1299 阅读 · 0 评论 -
Q&A——资源管理(十五)
资源管理Q1:我们项目做AssetBundle打包时,发现如果资源所依赖的C#Script的Public成员变量有变化时,用新代码加载旧的AssetBundle就会不兼容。有没有什么方法能判断这些Script在变化时是否需要重新打AssetBundle呢?目前我们使用.CS文件的MD5来判断是否需要重新打包,但其实这样应该有很多不必要的重复打包,对吗?该问题的本质原因是新代码的转载 2017-04-01 14:26:49 · 1072 阅读 · 1 评论 -
Q&A——性能
性能Q1:在整体的性能消耗上,CPU和GPU各占一半合理吗?如果不是,各占多少为好?还是说需要根据机型来看?其次,我如何知道游戏在手机上的GPU消耗?Profiler是看不到的,有工具推荐吗?首先,CPU和GPU是并行的,也就是CPU在运算的时候GPU也在运算,一帧的结束时间是两者中比较晚结束的那个。因此,一般我们在考虑这个问题的时候,经常会说是CPU bound还是GPU转载 2017-04-01 14:24:27 · 416 阅读 · 0 评论 -
Q&A——资源加载/卸载
资源加载/卸载Q1:如下图,通过纹理图片通过文件流形式加载到内存,这样的资源还可以使用Resources.UnloadUnusedAssets()和Resources.UnloadAsset(m_Asset)进行资源卸载吗?如果是自己载入内存并初始化为Unity的Texture2D,则还是要重点查看Texture2D对象的创建方式。一般来说,会用new Textur转载 2017-04-01 11:33:59 · 681 阅读 · 0 评论 -
Q&A——性能优化(三)
性能优化Q1:请问怎么优化下图这两者的GC Alloc?每次AddComponent 都会有这么多的开销。图中的两项GC Alloc是在进行AddComponent时不可避免的,因此只能通过尽量减少AddComponent的调用次数来进行优化。转载 2017-04-01 11:31:42 · 657 阅读 · 0 评论 -
Q&A——UI输入(三)
UI 输入Q1:UWA的直播里说的“将UI的Layer设置为不可见,从而将UI屏蔽”的方式具体是怎么实现的?为什么我在NGUI下直接设置UI元素的Layer不会生效呢?在NGUI中使用修改Layer的方式隐藏界面,必须以UIPanel为单位,即直接修改UIPanel所在的GameObject的Layer才会生效。因为对于UISprite或者UILabel,都会在运行时被强制修改为与转载 2017-04-01 11:26:45 · 802 阅读 · 0 评论 -
Q&A——物理
物理Q1:请问Physics.Processing的占用过大一般是因为什么原因导致的?影响物理系统耗时的因素主要为Contacts数量(碰撞对数量)、Rigidbody API的使用情况和每帧的调用次数。第一种情况是最为常见的引发物理模块耗时较大的原因,因此,我们在UWA性能报告中对其进行了详细的分析,如果你的报告中Contacts数量较高,切记要验证其转载 2017-04-01 11:16:34 · 862 阅读 · 0 评论 -
Q&A——图形渲染(三)
图形渲染Q1:我们的游戏中有一些静止的建筑,会和整个场景一起烘焙(包括了每个建筑在地表的阴影)。现在希望这些建筑是逐步开放的,比如玩家1级的时候只有建筑A开放,2级的时候建筑B开放,现在的问题是当建筑未开放时(SetActive(false))地表的相关阴影还在。这种问题一般是怎么处理的?这种问题是因为研发团队将整个场景烘焙成一张Lightmap所致。如果地图中的建筑是固定转载 2017-04-01 11:11:36 · 781 阅读 · 0 评论 -
Q&A——粒子系统
粒子系统Q1:粒子系统里面使用到的模型,是不是读写开关必须要打开,否则会崩溃?在Unity 5.3早期的版本中,我们确实收到过类似的反馈,在某些特效上使用了没有设置 Readable 的 Mesh 时就会触发崩溃,且在崩溃日志中会出现ParticleSystemRenderer::UpdateCachedMesh的堆栈。但目前我们在较新的版本上(例如4.7.2,5.3.5 等版转载 2017-04-01 11:08:07 · 391 阅读 · 0 评论 -
Q&A——其他
其他Q1:SkinnedMeshRenderer的Mesh是不是不能动态修改?属性里只开放了SharedMesh。如果需要动态修改 SkinnedMeshRender 对应的 Mesh,则可以通过读写 SharedMesh 来实现,类似于 MeshFilter.sharedMesh 的用法,参见:https://docs.unity3d.com/ScriptRefere转载 2017-04-01 11:07:11 · 483 阅读 · 0 评论 -
Q&A——渲染优化
渲染优化Q1:在Android平台上,PlayerSettings里开启/关闭Multithreaded Rendering,在性能和稳定性上有多大的区别? 一般是勾还是不勾?就我们目前深度优化过的项目而言,Android App中开启多线程渲染确实可以在渲染模块中带来较大的性能提升,但我们并没有详细地定量分析过,所以很难给出“到底能提升多少”的定量说明。对于稳定性来说,现转载 2017-03-31 18:26:08 · 1882 阅读 · 0 评论 -
Q&A——资源管理(十四)
资源管理Q1:我的游戏运行一段时间之后,已经切换到一个空场景了,然后手动调用了System.GC.Collect(); Resources.UnloadUnusedAssets();为什么还是会有这么多贴图资源被引用呢。我猜可能是由于一些脚本中的静态变量引用导致,请问有办法查出来是哪些静态变量吗?很大可能是这些资源直接或间接被其他Container缓存了,这种情况在我们进行内存转载 2017-03-31 18:22:15 · 535 阅读 · 0 评论 -
Q&A——资源管理(十三)
资源管理Q1:如下图,在UWA性能报告中,我们发现Camera.Render下CreateVBO的开销较高,请问这个是如何引起的?从图中可以看出,Mesh.CreateVBO是在半透明渲染的开销之下,说明这是半透明物体的渲染引起的。在我们目前测评过的项目中,仅使用NGUI的项目会在此处出现不同程度的CreateVBO的CPU开销。对此,建议研发团队首先确认其UI系统是否使用转载 2017-03-31 18:12:57 · 564 阅读 · 0 评论 -
Q&A——资源管理(十二)
资源管理Q1:我们在做依赖打包改进,比如UIAtlas这种脚本,AssetBundle包里脚本没有做依赖,每个包里都有这个脚本,会导致Mono堆内存增大么?对于“脚本也是资产”这一点理解的不是很透彻。脚本在AssetBundle里是不会启动,但是会出现脚本丢失。本身没有做依赖打包的话脚本是冗余在AssetBundle中吧?首先,需要说明的是,脚本本身的内容是不会被打包到Asse转载 2017-03-31 18:06:23 · 1000 阅读 · 0 评论 -
Q&A——资源管理(十一)
资源管理Q1:怎么去掉Mesh中的Colors属性?我把FBX里的LayerElementColor字段都删了,这个Colors还是存在。默认情况下,在3d建模软件中并不会导出Color属性。以3ds max为例,Color通常是通过modifier添加的,因此只需要在导出前将其删除即可。另外也可以通过fbx sdk来直接对文件进行处理,但这种做法就需要查看官方的文档了。转载 2017-03-31 17:52:25 · 847 阅读 · 0 评论 -
Q&A——UI Mesh 渲染
UI Mesh 渲染Q1:在GPU分析器里面看到,同一个NGUI的图集被绘制了很多次。请问是否是由于各个界面Panel不一样导致的?这种情况下如何优化?图片中红框处的内容其实并不是同一个Atlas被多次渲染,而是拥有同一Atlas的不同Widgets在进行渲染。这些Widgets的Mesh是动态生成的,且在不同的Draw Call中,NGUI在生成它们时根据所使用的At转载 2017-03-31 17:50:54 · 619 阅读 · 0 评论 -
Q&A——资源制作(一)
Q1:Unity UI图集不是正方形,使用PVRTC格式的话,会出现问题么?比如是512x1024的原始比例。如果纹理尺寸长宽不相等,那么即便是2的幂次,也不会被压缩成PVRTC格式纹理。建议在iOS平台中,尽可能保证纹理尺寸为2的幂次且长宽相等。转载 2017-03-31 17:45:24 · 796 阅读 · 0 评论 -
Q&A——动画(一)
动画Q1:我在Profiler中看到Animator.Initialize这个耗时很大,这个有什么建议么?Animator.Instance 是因为Animator过多造成的吗?由图中可知,Animator.Initialize主要是在Instantiate实例化时引起(实际上,GameObject.Active操作也会引起Animator.Initialize),而其具体的耗时原转载 2017-03-31 17:44:03 · 1678 阅读 · 0 评论 -
Q&A——资源管理(十)
资源管理Q1:关于定位游戏中冗余资源引用的问题。UWA的报告中能定位到具体的引用代码么? 在Profiler只能看到ManagedStaticReferences但是具体不到引用的位置。比如Static ClassA引用一个ClassB,ClassB上引用了一个资源,就定位不出这个引用的过程。请问这种情况下有没有比较好的方法找到引用关系呢?该问题在Unity 5.3 之前的版本转载 2017-03-31 17:38:18 · 1266 阅读 · 0 评论 -
Q&A——资源管理(九)
资源管理Q1:我在UGUI里更改了Image的Color属性,那么Canvas是否会重建?我只想借用它的Color做Animation里的变化量。如果修改的是Image组件上的Color属性,其原理是修改顶点色,因此是会引起网格的Rebuild的(即Canvas.BuildBatch操作,同时也会有Canvas.SendWillRenderCanvases的开销)。而通过修改顶转载 2017-03-31 17:24:17 · 494 阅读 · 0 评论 -
Q&A——性能优化(二)
性能优化Q1:Draw Call和Setpass Call,这两个指标主要是看哪一个?关于这点众说纷纭,很多地方都是说看SetPass Call,但是在UWA的性能测试中,还是把Draw Call当成唯一指标。在 Unity 5.x 中,SetPass Call与 Draw Call相比,SetPass Call的指标与性能相关性更大(比如Static Batching转载 2017-03-31 17:15:17 · 727 阅读 · 0 评论 -
Q&A——资源管理(八)
资源管理Q1: 我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出现。(Shader都在一个AssetBundle文件中,都是常驻内存的,不会删掉)是必须使用ShaderVariantCollection来加载Shader吗?A:以上这种问题的较大可能是:Shader被打包到不同AssetBundle中了,WarmupA转载 2017-03-31 17:08:07 · 555 阅读 · 0 评论 -
Q&A——开发技巧(一)
开发技巧Q1:我移动一个物体从A点到B点,当到达B点后执行另一个事件。我现在是每帧计算物体到B点的距离,当距离小于某个值后算是到达,感觉有点浪费。有没有什么推荐的办法呢?如果每帧只进行一次距离上的判断计算,那么该耗时开销本身是很小的。当然,开发团队可以在B点放置一个Trigger,当A进入Trigger后,通过其回调函数来进行物体的后续操作。转载 2017-03-31 17:04:25 · 955 阅读 · 0 评论 -
Q&A——资源管理(七)
资源管理Q1:我想请教一下,下图这个函数中,每次我都申请了一个List temp = list();在这里存放6KB的数据,但是如果不做GC处理,这6KB是否就一直累加,直到做GC处理了才会释放掉,是这样么?如果调用次数很多,每次都调用一点点,也会推高内存占用吗?A:是的,这个6KB堆内存会随着Update的执行一直分配内存,所累积的堆内存会在GC触发时进行销毁。一般来说,研发转载 2017-03-31 17:02:27 · 895 阅读 · 0 评论 -
Q&A——内存管理(三)
内存管理Q1:有没有办法可以减少游戏中Mono内存占用的大小?我现在读完游戏表以后就占用了60MB,我看其他游戏读完配置表也才10MB左右,这个是怎么做到的呀?如果刚进入游戏后,Mono堆内存就达到了60MB,那么你的游戏项目极有可能在一开始加载了一个非常大的配置表。对此,我们建议出现该问题的研发团队对配置文件的初始加载进行详细检测,查看是否可以精简配置文件信息。如果不行,则尝试将转载 2017-03-31 16:57:08 · 709 阅读 · 0 评论 -
Q&A——资源管理(六)
资源管理Q1:请教个问题,我用Unity 5 里提供的Sprite Packer把A.png,B.png打进一张图集,在运行时我怎么方便地加载这两张图呢?使用场景:某个Image控件根据不同的条件显示A,或者显示B。目前通常是在脚本序列化信息中保留这两个Sprite的引用,在切换时直接通过对Image.sprite进行赋值来切换。转载 2017-03-31 16:54:05 · 1141 阅读 · 0 评论 -
Q&A——UI输入(二)
UI输入Q1:关于UI的Mask遮挡特效,能否提供一些解决思路呢?目前由于UI与粒子系统是两个相对独立的模块,因此两者的Mask遮挡并没有简单直接的方法。我们建议从以下几种方式来考虑实现:将粒子系统转为序列帧,通过纯UI的方式来实现;通过RenderTexture,添加一个相机来实现方形的“裁剪”;参考UI的内置Shader,编写一个受Stencil B转载 2017-03-31 16:51:52 · 770 阅读 · 0 评论 -
Q&A——资源管理(五)
资源管理Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的?SerializedFile是AssetBundle加载时产生的序列化信息,一般为LoadFr转载 2017-03-29 18:26:53 · 760 阅读 · 0 评论 -
Q&A——资源管理(四)
资源管理Q1:Unity 5.x 能把指定集合的Mesh烘焙到一张Lightmap里吗?Unity 5.x 是没有这样的功能项的。据我们的判断,这样的需求通常是为了动态加载,因此可以尝试将Mesh分组到不同的场景分别烘焙。而在加载时可通过脚本动态地合并Lightmap,同时将物件的Lightmap Index进行正确的偏移即可。资源管理Q2:请问转载 2017-03-29 18:11:44 · 505 阅读 · 0 评论 -
Q&A——资源管理(三)
资源管理Q1:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗?这是可以的,但非常有限。因为不通过 AssetBundle 加载,只能通过 Unity 提供的有限的接口来直接加载外部资源,如通过 WWW.audioClip 直接加载 mp3文件,通过 WWW.texture 直接加载转载 2017-03-29 17:43:04 · 418 阅读 · 0 评论 -
Q&A——资源管理(二)
资源管理Q1:Prefab中的GameObject的tag设置为EditorOnly仍然会被打进Resoures包吗?有其它EditorOnly方案吗?EditorOnly理论上只对场景中的 GameObject起效。因此 Project 目录中的 Prefab 打上 EditorOnly 后,放在 Resources 目录下依然会被打进游戏包中。但只要将其放在 Resourc转载 2017-03-29 17:18:50 · 745 阅读 · 0 评论 -
Q&A——图形渲染(二)
图形渲染Q1:以前端游时代,材质根据Pass不同、光照环境不同可以离线预编译成ShaderCache,运行时并不需要拼材质再实时编译,只要加载二进制代码就好了。那Unity有没有做这件事呢?我们是根据平台和环境预编译的Shader。对于支持 Binary Shader 加载的设备,在首次编译某个 Shader 的时候是会生成其对应的 Binary Shader Cache ,生转载 2017-03-29 17:18:02 · 714 阅读 · 0 评论 -
Q&A——性能优化(一)
性能优化Q1:如图,我们在UI打开或者移动到某处的时候经常会观测到CPU上的冲激,经过进一步观察发现是因为Instantiate产生了大量的GC。想请问下Instantiate是否应该产生GC呢?我们能否通过资源制作上的调整来避免这样的GC呢?如下图,因为一次性产生若干MB的GC在直观感受上还是很可观的。准确的说这些 GC Alloc 并不是由Instantiate 直转载 2017-03-29 16:53:17 · 810 阅读 · 0 评论 -
Q&A——骨骼优化
骨骼优化Q1:勾选了“Optimize GameObject”这个选项后,虽然性能优化了,可骨骼的TransForm会消失,有些需求又是需要在某个骨骼的TransForm上面挂特效的,这种情况下有什么比较好的处理方案吗?在选择Optimize GameObjects后,可在Extra Transforms中加入你想挂载特效的骨骼结点,这样该骨骼结点将不会进行优化处理,即其Tra转载 2017-03-29 16:47:09 · 569 阅读 · 0 评论 -
Q&A——AssetBundle(资源打包)
Q1:如果我有一个Prefab,它的Dependencies都在Resources文件夹中,那么,当我在AssetBundle打包时,只打包这个Prefab(不指定BuildAssetBundleOptions.CompleteAssets和BuildAssetBundleOptionsCollectDependencies)的话,这个Prefab能够正确实例化吗?这是不能正确实例化的转载 2017-03-29 16:38:01 · 278 阅读 · 0 评论 -
Q&A——光照贴图
Q1:Lightmap在PC上显示正常,但是转到Android平台上存在色差,颜色普遍偏暗。一般来讲,有两种情况可能会导致色偏和亮度差异。1.Unity烘焙的Lightmap是32bit的HDR图,而移动设备通常不支持HDR图(32bit per channel),会按照LDR图(8bit per channel)的形式进行处理,因此会出现色偏问题。因此我们建议:在转载 2017-03-29 16:34:33 · 315 阅读 · 0 评论 -
Q&A——版本Bug(一)
版本BugQ1:在把Unity升级到5.3之后,项目中缓存的粒子特效无法正常播放了(只能播放一次),是否还需要修改粒子的设置呢?这个问题是Unity的Bug,5.4.0B3 release note 为:Particles: Fixed particle system only playing once.(会在新版本5.4修复)目前我们推荐通过另一种方法可以暂转载 2017-03-29 16:16:24 · 307 阅读 · 0 评论 -
Q&A——UI输入(一)
UI输入Q1:在使用NGUI时,我们通常会将很多小图打成一个大的图集,以优化内存和Draw Call。而在UGUI时代,UI所使用的Image必须是Sprite;Unity提供了SpritePacker。 它的工作流程和UGUI Atlas Paker有较大的差别。在Unity Asset中,我们压根看不到图集的存在。 问题是:1. SpritePacker大概的工作机制是什么样的转载 2017-03-29 16:02:48 · 902 阅读 · 0 评论 -
Q&A——内存管理(二)
内存管理Q1:我们在Profiler中发现了一个AssetDatabase的内存占用,其存在于Assets中,单个占用内存非常大。 请问该占用是如何发生的呢?是否可以避免?理论上开发者在真机运行项目时是不会看到此选项的,只有在 Editor 中运行时能看到。由于在 Editor 下运行游戏时,Profiler 中获取的内存是包含了 Editor 本身占用的内存的,因此并不准转载 2017-03-28 18:31:30 · 894 阅读 · 0 评论 -
Q&A——物理性能
物理Q2:UWA的报告中指出我们所使用的刚体超出了限制,我们经过测试发现只要使用CharacterController就会产生一个隐藏的刚体。而我们的角色移动是会使用CharacterController的。 为了避免这种情况,我们使用了CapsuleCollider来替代CharacterController接受点击,同时使用设置位置的方法来替代CharacterController的m转载 2017-03-28 18:21:46 · 346 阅读 · 0 评论