UWA 技术分享连载 转载

技术分享连载1

Q1:Texture占用内存总是双倍,这个是我们自己的问题,还是Unity引擎的机制?

Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Update方法及其同类空方法,不知道是否还有其他因素?

Q3:在Unity的内存管理机制中, Reserved Total 和 Used Total之间的关系是怎样的?

Q4:纹理Atlas是建议合成一张2048(尺寸)的纹理还是四张1024的纹理?

Q5:在把Unity升级到5.3之后,项目中缓存的粒子特效无法正常播放了(只能播放一次),是否还需要修改粒子的设置呢?

技术分享连载2

Q1:Lightmap在PC上显示正常,但是转到Android平台上存在色差,颜色普遍偏暗。

Q2:Lightmap丢失。用Unity5.1.2的AssetBundle做热更新,资源导出的时候分析了所有的依赖项单文件导出。比如在导出场景的时候场景的烘焙出来的LightmapSnapshot.asset文件导出不了,导致运行的时候场景的Lightmap丢失了。

Q3:Unity 5.3版本WWW有泄漏,用Unity的Profiler看不出来内存的变化,但用Android或者iOS的内存查看工具就能发现内存在一直增加。之前同样的步骤测试5.2.3版本就没问题。 如图:

Q4:如果我有一个Prefab,它的Dependencies都在Resources文件夹中,那么,当我在AssetBundle打包时,只打包这个Prefab(不指定BuildAssetBundleOptions.CompleteAssets和BuildAssetBundleOptionsCollectDependencies)的话,这个Prefab能够正确实例化吗?

Q5:假设有两个界面Panel A和Panel B,它们均依赖一个共享Atlas C。AssetBundle打包时,如果我们将其分别打包的话,那么在使用时是否不能将AssetBundle C进行卸载?如果在加载Panel A和B之前,将Atlas C加载到内存中,但是将AssetBundle C进行卸载,那么在加载和实例化Panel A和B时,是否会出问题?

技术分享连载3

Q1:如图,在Editor中查看Profiler里的内存详细信息,发现Used Total中有个“Unity”,请问是什么意思?为什么会特别大?

Q2: 在进行内存优化时,Unity Profiler给出的数据和Android系统(adb dumpsys meminfo,已经考虑memtrack的影响 )的数据差距较大(已经分析了Profiler自身的内存占用),如何分析这部分差异,比如包括对显存消耗进行准确统计,OS消耗的统计等等?

Q3:iOS上PVRTC不支持NPOT的贴图压缩,在Android上可以用ETC2,但在iOS上不能压缩,内存消耗大。请问在iOS上有没有好的处理方案?

Q4:怎样动态加载Navmesh?

Q5:当关闭预渲染GI时会出现IndirectResolution,这个参数有什么用,为什么调大了以后会大大增加渲染时间,但是烘培出来却没有什么效果。

技术分享连载4

Q1:System.ExecutableAndDlls占内存巨大,且一直在增长,这个属于正常情况吗?

Q2:已经预加载怪物,然后显示怪物 PSS上升,并且在隐藏怪物后并没有下降,这是什么原因导致?显存上去了吗?

Q3:我们在美术制作时做了40根骨骼,但在动作中仅用到了其中的30根。这种做法和30根骨骼用到了30根相比,在蒙皮计算上会明显增加吗?(Animation经过了压缩处理)

Q4:Unity对Dynamic Batching的数量是否有限制?或者说对Saved by Batch的数量是否有限制?

Q5:不太明白Profiler中ManagedHeap.UsedSize是什么,以及这个参数的意义何在?是否重要?

技术分享连载5

Q1:能否在NGUI多分辨率适应方面提供一些解决方案或者思路?

Q2:请问Unity引擎中使用什么贴图压缩格式,可以保证在占用内存相对较小的情况下True Color效果和原图相当?同时在iOS和Android平台上图片的压缩格式分别用什么比较合适?有什么需要注意的地方吗?

Q3:在UWA的帮助下,我们追踪到了一个Reserved GFX的内存占用,并且显示比较高。我们应当如何降低该内存占用呢?

Q4:请问游戏中特效使用的很多贴图, 一般有什么好的方式去管理吗 ? 不合并图集的话会有上千张小的透明贴图, 合并图集又会有占用内存过多的问题。

Q5: 在Unity开发中,大规模使用粒子特效会有什么问题 ?如何去针对性的优化?

技术分享连载6

Q1:如果一个模型对应Skinned Mesh Renderer实例,那其所占的内存会随着角色增加而增长么 ?

Q2:在同一场景里烘培的Lightmap,我用了2张10241024的光照图,大小是5.3MB;别人用了3张10241024的图,大小是4.3MB。请问是什么影响这个光照图的大小,在哪里调?

Q3:NGUI变形,如下图走样了,请问是不是图片压缩导致的?

Q4:在游戏中,有些Mesh在编辑时候是接收Lightmap的,出于某些原因我们合并了相同的Mesh(材质也相同)。但是发现原先的Lightmap不再影响合并后的Mesh,请问怎么才能实现让合并后的Mesh也接收原先的Lightmap?

Q5:我们打出来的ipa包大概有220MB ,相同的资源APK包只有120MB左右, 相差100多MB 。我们查过网上其他已上市游戏的ipa,apk两个包,两个包体都只相差15~30MB,请问我们这种情况是否正常,有没有办法进一步压缩ipa安装包?

技术分享连载7

Q1:如下图,我们发现WaitingForJob这个函数消耗过高导致了卡顿,请问该卡顿是否由于渲染压力过大导致?

Q2:UWA的报告中指出我们所使用的刚体超出了限制,我们经过测试发现只要使用CharacterController就会产生一个隐藏的刚体。而我们的角色移动是会使用CharacterController的。 为了避免这种情况,我们使用了CapsuleCollider来替代CharacterController接受点击,同时使用设置位置的方法来替代CharacterController的move。

1. 请问这样做是否有风险,并且是否可以降低我们在刚体和物理系统方面的开销呢?

2. 同期我们观测到了一个以前没有关注过的警告。其内容为:
Static Collider.Move (Expensive Delayed cost),请问该报错是否与我们的调整相关?能够导致该警告的原因可能会有哪些呢?

Q3:我在shader里这么写的代码

o.texcoord1 = vec2(mod(v.texcoord.x,1.0),mod(v.texcoord.y,1.0));  

但是报错 undeclared identifier ‘mod’ at line 106 (on d3d11),请问是什么原因导致的呢?

Q4:我们在查看《六龙争霸测评精讲》时,看到下图中的GC的调用,请问该数值的是取决于明式调用System.GC.Collect()这个方法吗,还是指系统自动GC的频率?

Q5:我们的游戏玩了20分钟后,Texture2D的内存涨到了60MB多,并且重复的资源很多,是否由于没有卸载完全?还是打包AssetBundle依赖性的问题?用的是UGUI。

Q6:如下图,我们在Unity 5.3.0中使用粒子系统时会触发一个ParticleSystem.Geometryjob的操作,并且该操作十分消耗CPU,请问怎么解决?

Q7:如下图:我在Profiler中看到这些没有引用的资源,他们是否还在内存中?

技术分享连载8

Q1:在报告中我们看到函数uwa-xxx是我们加的自定义代码段采样, 我们发现它们触发了很多GC, 是什么情况呢?

Q2:下图一是刚进游戏时获取的信息,第二张是开关几次同一个UI界面后获取,对比两图我们发现有多份重复的Texture。请问这是为什么?我们的加载方式是UI通过AssetBundle加载,加载后会释放AssetBundle,然后再次加载 UI 就会造成纹理资源的冗余。

Q3:我们在UWA报告中看到有拼合粒子系统和未拼合粒子系统,请问如何拼合粒子系统?有没有什么规则呢?

Q4:项目中勾选Static Batching和不勾选对效率有多大影响?我们在使用中发现勾选了以后包大小会增大一倍。如果不勾选,和自己在代码中调用StaticBatchingUtility.Combine的效率有多大区别?

Q5:我们在Profiler中发现了一个AssetDatabase的内存占用,其存在于Assets中,单个占用内存非常大。 请问该占用是如何发生的呢?是否可以避免?

技术分享连载9

技术分享连载10

Q1:在使用NGUI时,我们通常会将很多小图打成一个大的图集,以优化内存和Draw Call。而在UGUI时代,UI所使用的Image必须是Sprite;Unity提供了SpritePacker。 它的工作流程和UGUI Atlas Paker有较大的差别。在Unity Asset中,我们压根看不到图集的存在。 问题是:
1. SpritePacker大概的工作机制是什么样的?

2. 如果Sprite没有打包成AssetBundle,直接在GameObject上引用,那么在Build时Unity会将分散的Sprite拼接在一起么?如果没有拼接,那SpritePacker是不是只会优化Draw Call,内存占用上和不用SpritePacker的分离图效果一样?

3. 如果将Sprite打成AssetBundle,AssetBundle中的资源是分散的Sprite吗?如果不是,不同的AssetBundle中引用了两张Sprite,这两张Sprite恰好用SpritePacker拼在了一起,是不是就会存在两份拼接的Sprite集?

4. 如果想使用NGUI Atlas Packer的工作流程,改如何去实现?

Q2:同样的App,安装在不同的机型上,使用同样的自动化脚本进行自动化测试,App的内存消耗(ADB Dumpsys Meminfo)在不同的机型上结果迥异,有些机型只有200MB多的内存消耗,有些机型高达600MB。我们已经分析过OpenGL ES 2.0和OpenGL ES 3.0对ETC2贴图解压的影响。200MB左右的机型有些是ES2.0,600MB消耗的机型有些是ES3.0的,并且多次测试可重现。请问你们如何分析这个问题?是否有标准来确定游戏真正的内存消耗?

Q3:首先用户或者产品只关心整体消耗,并不会以Profiler为准,内存不足的崩溃也不会以Profiler正常而消失。其次,我们降低Profiler统计的消耗后,OS的消耗也会大大降低,甚至下降的更多。我们据此判断:这两个数字不一样,但应该是有联系的。我们想知道联系是什么?

Q4:当关闭预渲染GI时会出现IndirectResolution,这个参数有什么用,为什么调大了以后会大大增加渲染时间,但是烘培出来没有啥效果。

Q5:如何在移动设备上,对Bloom和全屏抗锯齿进行优化?Unity标准资源里面自带的效率比较低(已经尝试过Bloom(Optimized))。

技术分享连载11

Q1:正常情况下游戏如果一直玩下去,Mono是不是会一直增加? 比如频繁打开一个界面,界面里有脚本会不断创建一些东西 ,那么Mono是否会不断增加?对性能上会不会造成影响呢?

Q2:关于抗锯齿和BLOOM,有什么好的优化方案或者优秀插件推荐?

Q3:我们在编译安卓版本时,在某些设备上(Sony L36h,小米4)调试时,发现有一个时间消耗项叫Graphics.PresentAndSync,该函数对性能的消耗会特别夸张(渲染20毫秒,这个能达到50毫秒)。查了相关文档,发现该函数好像和安卓设备的垂直同步有关,但是大部分安卓设备的垂直同步是不可以关闭的。请问有什么好的办法解决吗?

Q4:我们使用UGUI,Sprite一般都选择默认的格式了,Compressed,但是在iOS设备下就会糊,用TrueColor就很大,请问一般该如何处理呢?

Q5:我们这种英雄UI,里面嵌了一个类似场景的Prefab,开了实时光照之后内存就特别高。这种不属于场景,又没有办法烘培,有没有什么好的建议呢?

技术分享连载12

Q1:下图是UWA性能检测报告,图中标红的这两个函数常常导致很高的堆内存分配,那么我该如何检查或者避免呢?

Q2:如果脚本引用了GameObject,那转换场景的时候脚本和GameObject都没了,还会产生堆内存的吗?

Q3:在Unity 4.x的版本中,所有UI贴图使用ETC2格式,即使目标设备不支持该格式,也会解压成RGBA32使用。 而在目前使用的Unity 5.3.4版本中,iOS平台无法设置ETC2格式。如果压缩只能使用PVRTC格式,那么PVRTC存在显示效果比较差,并且图片必须为正方形,但如果用RGBA32格式,贴图占用的内存和存储又都过大,请问目前版本的Unity在iOS平台上应该如何设置UI贴图的压缩格式?

Q4:UWA性能检测报告中的Shared UI Mesh表示什么呢?

Q5:勾选了“Optimize GameObject”这个选项后,虽然性能优化了,可骨骼的TransForm会消失,有些需求又是需要在某个骨骼的TransForm上面挂特效的,这种情况下有什么比较好的处理方案吗?

技术分享连载13

Q1: 请问粒子特效的Shader是否不能使用依赖打包? 我们对Shader的模型和特效使用了依赖打包,运行的时候发现模型显示是正常的,但是粒子特效使用的Shader就不能正常运行,特效显示不正常。而在编辑器中,我们看到Material中的Shader是存在的。这时候如果重新手动给这个Material指定同样的Shader,这个粒子特效就能正常显示,请问这是什么原因引起的?

Q2:如图,我们在UI打开或者移动到某处的时候经常会观测到CPU上的冲激,经过进一步观察发现是因为Instantiate产生了大量的GC。想请问下Instantiate是否应该产生GC呢?我们能否通过资源制作上的调整来避免这样的GC呢?如下图,因为一次性产生若干MB的GC在直观感受上还是很可观的。

Q3: iOS平台需要对图集做RGB和Alpha通道的分离吗?我发现在同样大小的图片(正方形),RGB Compressed PVRTC 4bits和RGBA Compressed PVRTC 4bits两种格式,占用内存是一样的,如果把一张图片分成两张,那么在iOS平台是不是占用内存多一倍?有透明通道的,对于它的图集怎么处理会更好一点?

Q4: 关于场景中玩家和NPC名字的DrawCall的问题。我们项目中是使用TextMesh挂到场景单位上,但是这样每个名字就占了一个DrawCall,请问有没有好的办法优化呢?

Q5: 我们能通过Batching来进行效能方面的优化吗?透过粒子发射出来的半透明模型片是无法Saved by Batching ,如果粒子可以使用Dynamic Batching的话,想请教具体的使用规则与方法。

技术分享连载14

Q1:能否对提升NGUI的渲染效率提供一些思路?

Q2:如下图所示,第一张显示的是没有烘培Lightmap的场景效果,里面有一盏点光源;第二张显示的是烘培Lightmap后的场景效果。请问为什么同一盏点光源照亮的效果差别那么大?

Q3:在UWA给出的报告中,我们发现了Animator过高的情况,其中UI和角色各占一半。我们之前一直选择CullUpdateTransforms,通过阅读Unity官方文档发现CullCompletely更符合我们的现状,想请教下如果我们选择CullCompletely可能会有什么隐患呢?

Q4:我有一个UI预设,它使用了一个图集, 我在打包的时候把图集和UI一起打成了AssetBundle。我在加载生成了GameObject后立刻卸载了AssetBundle对象, 但是当我后面再销毁GameObject的时候发现图集依然存在,这是什么情况呢?

Q5:我们现在有一个场景,Draw Call和面数都在正常范围内,Camera的距离也和其他场景一样,但是VBO却非常高。下图是该场景的数据情况,该场景下有很多复用的模型,如果不勾选Static那VBO会下降,但是Draw Call会上升。那我能否通过合并模型的方式把VBO降下来呢?

技术分享连载15

Q1:以前端游时代,材质根据Pass不同、光照环境不同可以离线预编译成ShaderCache,运行时并不需要拼材质再实时编译,只要加载二进制代码就好了。那Unity有没有做这件事呢?我们是根据平台和环境预编译的Shader。

Q2:相同效果前提下,就性能而言,Shader 是用 V&F 还是Surface好?

Q3:Lightmap在Baked GI的等待时间比较长(Realtime GI已关闭),想请教有没有什么建议的参数或是方式,可以缩短等待的时间?

Q4:Prefab中的GameObject的tag设置为EditorOnly仍然会被打进Resoures包吗?有其它EditorOnly方案吗?

Q5:对于Handheld.PlayFullScreenMovie 这个Unity播放开场动画的API,会有内存问题吗?比如我的mp4动画有20MB,那么这个动画会撑高mono堆内存吗?

技术分享连载16

Q1:请教,角色分部件换装可行吗?比如衣服裤子分开,都是用Skinned Mesh Render,有没有办法合并降低Draw Call?

Q2:打包时候AssetBundle的md5总变化(被打包的东西没变),请问能怎么解决?有说法是加上DeterministicAssetBundle就可以,但是我尝试后发现md5依然变化。

Q3:我用的是UGUI Canvas,Unity 5.3.4版本,请问如何查看每次Rebuild Batch影响的顶点数, Memory Profiler是个办法但是不好定位。

Q4:通过移动位置来隐藏UI界面,会使得被隐藏的UIPanel继续执行更新(LateUpdate有持续开销),那么如果打开的界面比较多,CPU的持续开销是否就会超过一次SetActive所带来的开销?

Q5:游戏中出现UI界面重叠,该怎么处理较好?比如当前有一个全屏显示的UI界面,点其中一个按钮会再起一个全屏界面,并把第一个UI界面盖住。我现在的做法是把被覆盖的界面 SetActive(False),但发现后续 SetActive(True) 的时候会有 GC.Alloc 产生。这种情况下,希望既降低 Batches 又降低 GC Alloc 的话,有什么推荐的方案吗?

技术分享连载17

Q1:请问内置的shader怎么打包?我用到了内置材质球,不只是Shader,这时候在Profiler中看到加载的结果中会出现多份,如下图所示:

Q2:我在Profiler中看到 GC.MarkDependencies 的CPU消耗有900ms+, 虽然在退出战斗的时候调用了Resources.UnloadUnusedAssets(); 可是卡顿还是很明显,请问有什么推荐的方案吗?

Q3:在UI界面中,用Canvas还是用RectTransform做根节点更好?哪种方法效率更高?

Q4:用Resources.UnloadAsset 释放未Instance的Object 会出现这样的错误 :Unload Assets may only be used on individual assets and can not be used on GameObject’s/Components or AssetBundles.请问该如何解决?

Q5:我现在动态加载StreamingAssets下的贴图,代码如下:
我发现这种方式内存消耗很大,一张512 x 512的贴图占用了2MB,看官方的解析是内存和显存各需一份。想了解下动态加载贴图有什么推荐的方式吗?

技术分享连载18

Q1:我看到Unity 5.3.5版本中恢复了对粒子系统的合批功能,但是我尝试下来并没有达到这个效果。是粒子系统合批有什么要求吗,实例化会不会对粒子系统的合批造成影响呢?

Q2:我用的是Resource的加载方式,并且已经预加载好了材质所在的Prefab ,但是为什么在第一次显示材质的时候还要Load这个材质?

Q3:我们的游戏使用 Spine 插件,因为要用到裁切动画,所以修改了Shader,但在使用的时候出现异常: Shader wants normals, but the mesh Skeleton Mesh doesn’t have them,可能是什么原因?

Q4:我在第一次执行GameObject.Instantiate一些资源的时候会卡(当时加载当时就实例的情况),有的复杂资源甚至在第一次GameObject.Instantiate的时候会卡70多毫秒,造成明显的卡顿,请问有什么好的解决方案吗?

Q5:同一个纹理,有多个Prefab生成的实例,会有多份这个纹理的copy吗?

技术分享连载19

Q1:我项目的UnityShaderCache目录下有300个文件(如下),且不是一次生成, 而是随着游戏进行而产生的。为了在游戏第一次进行时把所有Shader都编译来减少卡顿,我把用到的Shader加入到 Always Included Shaders中, 并在游戏开始时调用了 Shader.WarmupAllShaders,也尝试把Shader打个包一起加载出来 ,然后Shader.WarmupAllShaders,但是效果并不理想。有什么好的解决方案吗?

另一个困惑:已加到 Always Included Shaders 中的。 还需要再加载一次么?

Q2:某个Shader里设置了Culling Off,会影响到后面所有Shader的渲染状态么(假设后面不再设置Culling)?

Q3:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗?

Q4:项目在发布时,Player Setting中勾选的这个选项,UWA Tech Doc对于已经打包并且放到了Streaming Assets中的AssetBundle文件有效果吗?模型资源里有个UWA Tech Doc选项,是否能达到同样的效果?

Q5:我们的动画是放在FBX文件里的(如下图)
这样做导致打包的时候把一些无用的文件也打进AssetBundle包里了,实际上我们只想使用最后这个动画文件。但在编辑器里选中FBX文件里的动画文件时却没有AssetLabels这个窗口,设置不了AssetBundle Name。
是不是只能用代码设置?还是意味着不能设置AssetBundle Name,只能把动画文件提取出来,类似下图这样单独的一个文件?

技术分享连载20

Q1:我想要在Editor下批量地对Animator Controller文件中每一个的State里的Animation Clip进行替换,但好像没有看到 Unity引擎有提供类似的API,只提供了能在Runtime时进行替换的方法,类似下图:
UWA Tech Doc
我现在想要达到的目地是在Editor下写一个批量替换Animation Clip的插件,请问下Unity引擎是否有提供这样的接口呢?

Q2:我用UGUI做的一个界面中有一个背景图片,游戏中没有做任何处理,关闭销毁这个界面后这个图片还在内存中,但是我已经调用过了Resources.UnloadUnusedAssets,如下图所示。我的预设没有打成AssetBundle,是放在Resource路径加载的。请问是什么原因导致的呢?

Q3:同样的包同一个图集,ETC2格式,在红米Note1上会比酷派的内存会大四倍,请问这是什么原因造成的?如果不支持OpenGL 3.0,会造成这么大的影响吗?

Q4:MeshBaker 烘焙的Mesh可以保存到Prefab中,但是不能像FBX一样,设置Model导入设置中的Generate Lightmap UVs 等信息,请问有没有大招可以处理此情况?

Q5:如果我的Animator是直接引用了FBX里的动画文件,而不是复制了FBX的动画文件出来再引用,那么打包的时候会把FBX都打包吗?

技术分享连载21

技术分享连载22

Q1:StaticBatchingUtility.Combine会产生Combined Mesh的内存,如何手动删除这部分内存?

Q2:Unity 5.x 能把指定集合的Mesh烘焙到一张Lightmap里吗?

Q3:我们现在采取了2种资源管理方式, 我想了解下内存占用问题。 方式A:AssetBundle加载好以后在内存中保留, 如果需要创建对象就通过Instantiate来创建。方式B:AssetBundle加载好以后立刻通过Instantiate实例化一个对象, 然后Unload(false)这个AssetBundle,如果需要,创建对象通过clone来完成。对于方式A,在Profiler中发现 WebStream中有相关AssetBundle文件存在, 我们认为这份内存是多余的, 所以就采取了方式B, 方式B又面临资源卸载不干净的情况。想确认一个问题, 如果采取方式A: 一个 xxx.assetBundle原始文件大小是 1MB, 解压到Webstream内存中是2MB, 最终实际内存占用是2MB 还是3MB 呢?

Q4:请问一下,我两个预设都引用了第三个AssetBundle的贴图,如果不希望这张贴图存在两份,一定要等这两个预设都加载好了,才能卸载贴图的AssetBundle吗 ?

Q5: 关于Loading.ReadObject耗费比较高,有什么推荐的方法吗?

技术分享连载23

Q1:请问音频中的 Quality 什么意思?一般设置为多少合适?我拖进去一首歌曲,试了一下 在0 和 100 的情况下区别不大,但是生成的音频文件大小差别很大。

Q2: 我做的预设用到了这个字体

我将这个预设打成AssetBundle包,通过Profiler分析时发现占了两份内存。

下面这个SIMHEI应该是那个TTF的,为什么会占两份内存呢?

Q3: 我在Profiler中看到GameObject.Deactivate耗时较大,请问该如何优化?

Q4: 我有一个特效依赖了两个FBX。我把这两个FBX的这个勾选去掉,Editor运行正常。

Q5: 我用内建的Shader渲染场景,深度图里有内容。而用自己的Shader,取到的深度图什么都没有,都是1,什么原因导致的呢?我已经打开ZWrite了。

技术分享连载24

Q1:字体作为多个资源的依赖包,会在游戏中被加载多次。我们现在有个问题,AssetBundle A资源依赖于这个字体,加载A的时候加载了一份字体,然后B资源也依赖这字体,而后加载B的时候我们没有去重复加载字体,这时候发现B资源上出现了字体丢失的现象。

请问加载资源的时候,Unity会自动去识别内存里是否有它的资源依赖包吗?如果有的话,为什么B加载的时候找不到已经存在内存中的字体?这里需要手动去做些什么处理吗?

同时我发现依赖包资源如果进行了bundle.m_AssetBundle.Unload(false)以后,其他依赖于这个包的资源就引用不到了。我们流程上对于每个读进来的AssetBundle,都会加载完后马上进行Unload(false),请问如果是依赖包的话,是不是不能对其进行这步操作?

Q2: 我在用Profiler真机查看iPhone App时,发现第一次打开某些UI时,Font.CacheFontForText占用时间超过2s,这块主要是由什么影响的?若iPhone5在这个接口消耗2s多,是不是问题很大?这个消耗和已经生成的RenderTexture的大小有关吗?

Q3:SkinnedMeshRenderer.BakeMesh这个函数一般是什么时候调用呢?在Instantiate后调用么?

Q4:我用Profiler.BeginSample统计到的数据与直接看Memory下的不一样,前者比后者的数据更大,这是为何? 用Profiler的API获取到的这一帧的内存消耗是85.6MB,而堆内存中显示的是62.9MB,这怎么理解?

Profiler.BeginSample
请输入图片描述

Profiler中数据
请输入图片描述

Q5:将Shader独立打包,如果我在启动游戏的时候加载一次,那么之后切换场景是不是就不用每次都加载了?

技术分享连载25

Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的?
UWA Tech Doc

Q2:我游戏里重复的特效较多,有些只是图案相同但改变了颜色参数,如果都打成独立AssetBundle,则内存里面会有多份Texture。关于这样的打包一般有什么推荐的方法呢?

Q3:我发现ScrollRect里有大量元素,在拖动的时候触发了很多onTransformChanged,能否提供一些优化思路?

Q4:是否有办法用RenderTexture直接生成PVRTC或者ETC格式的Texture2D贴图?

Q5:有时候在Profiler中会碰到Static Collider.Move(Expensive delay cost),有什么办法可以优化掉呢?

技术分享连载26

Q1:我们游戏用的是TM4,4层Tilling贴图+1层融合贴图,发现手机发热现象严重,影响性能的表现,请问有什么标准或者参考数据吗?

Q2:我们通过AssetBundle预加载Shader后,并没有卸载AssetBundle,但是发现后面加载的Object并没有引用到正确的Shader,这可能是由于什么原因呢?

Q3:Shader.Parse 和 Shader.CreateGpuProgram 到底是做什么的?他们什么时候执行?

Q4:动静分离或者多Canvas带来性能提升的理论基础是什么呢?如果静态部分不变动,整个Canvas就不刷新了?

Q5:关于UI的Mask遮挡特效,能否提供一些解决思路呢?

技术分享连载27

技术分享连载28

Q1:在UWA性能报告中,你们建议我们选中Optimize GameObject来提升Mecanim动画模块的运行性能,但是这个功能会隐蔽角色骨骼,那么要挂载该骨骼上的这个点就无法查询了,有什么办法可以解决这个问题吗?

Q2: 我在Profiler中看到Other下System.ExecutableAndDlls的内存很大,请问这个是什么东西,对我们游戏的性能影响很大吗?

Q3:我们发现材质实例数量特别多,想问下这个对性能的影响如何,有没有什么建议?

Q4:现在Unity还不能将场景和 NavMesh数据或者Lightmap数据分离,是吗?我是想先加载一个干净的场景,然后再动态切入不同的光照贴图和NavMesh网格数据,有什么办法吗?

Q5:判断怪物是否在相机视野范围有没有什么好方法?

技术分享连载29

Q1:我们现在为了美观,需要同时使用2套字体。但是每增加一套字体,就会内存增加50MB左右。请问你们在优化其他Unity游戏时,怎么处理类似情况的?

Q2:我在UWA测评报告中看到该项CPU耗时很高,请问这是什么引起的?可以优化掉吗?

Q3:请问这个Loading.UpdatePreloading是什么东西,为什么会突然那么高?一般情况下有没有什么优化的办法?

Q4:请问,Canvas里的东西移出了屏幕后,DrawCall没降低,那么它还会每帧去绘制吗?

Q5:我在UWA报告中看到大量的n/a资源,其格式的高度和宽度等信息都无法获取,并且存在大量重复,请问我该如何定位这些文件?能否优化解决呢?

技术分享连载30

技术分享连载31

技术分享连载32

Q1:切换场景时,卸载上一个场景总感觉耗时,请问大家是否有什么推荐的方案?

Q2: 我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出现。(Shader都在一个AssetBundle文件中,都是常驻内存的,不会删掉)是必须使用ShaderVariantCollection来加载Shader吗?

Q3: iOS上方形POT图片有时候会失真,请问这种情况如何避免?一张NPOT的图变换成POT,是否有推荐的方法? 采用 ToLarger 的模式拉成POT是否会有损失呢?

Q4: 多人同屏的时候,人物移动会使得头顶上的名字Mesh重组,从而导致较为严重的卡顿,请问一下是否有优化的办法?

Q5:AssetBundle在使用时解压出来的资源会占用一定的内存。我们现在想尝试使用两种加载方式:(1)在AssetBundle加载相关的资源后,将资源进行缓存,并卸载AssetBundle文件;(2)对AssetBundle文件进行缓存,以后用到相关资源后再进行直接进行加载。请问这两种方式你们推荐哪一种比较好?

技术分享连载33

Q1:在Unity 5.x版本下,我们在用UGUI的过程中发现它把图集都打进了包里,这样就不能自动更新了,请问图集怎么做自动更新呢?

Q2:图中的Material.SetPassFast占用很高,这是我在第一次实例化一个特效,但是第二次实例化就不会出现高值了,请问能怎么优化吗?

Q3: UWA建议“尽可能将静态UI元素和频繁变化的动态UI元素分开,存放于不同的Panel下。同时,对于不同频率的动态元素也建议存放于不同的Panel中。”那么请问,如果把特效放在Panel里面,需要把特效拆到动态的里面吗?

Q4:Draw Call和Setpass Call,这两个指标主要是看哪一个?关于这点众说纷纭,很多地方都是说看SetPass Call,但是在UWA的性能测试中,还是把Draw Call当成唯一指标。

Q5:我看到UICamera.Update()的GC调用特别高,只要我一移动就会产生2.8K的GC,看起来是NGUITools.FindInParents这个方法导致的,有没有什么可以优化的方法呢?

技术分享连载34

Q1:我用NGUI开发,因为角色名字导致重建,使得UIPanel.LateUpdate的CPU占用很高。如果将它们分离到多个UIPanel里,是否这个开销会相对小一些?

Q2:加载UI预制的时候,如果把特效放到预制里,会导致加载非常耗时。怎么优化这个加载时间呢?

Q3:能否就UGUI Batch提出一些建议呢?是否有一些Batch的规则?

Q4:ScrollRect在滚动的时候,会产生Canvas.SendwillRenderCanvases,有办法消除吗?

技术分享连载35

Q1:我在UWA上进行了性能检测,在资源内存这里看到详情如下。请问这个数量峰值大于1是不是就是有问题的?但一个Material是很可能被实例化多份的。实例化后对象释放掉,然后清理掉原始的Material,按道理就不算冗余吧?毕竟大部分都是材质在操作,对贴图资源应该没有影响。而且,如果确实有那么多角色同屏怎么办呢?

Q2: 对NGUI字体错乱有什么好的解决方案吗?

Q3:这个批渲染是什么?好像开销很高 。

Q4:我们测试发现,当Animator Controller挂载的动作比较多时,即使切换成另外一个动作很少的Animator Controller,任务的动作信息还是不会释放。我们将英雄打成一个AssetBundle,然后又把定制的Runtime Animator Controller加载替换进去,英雄自带的Runtime Animator Controller是挂了所有动作的。我们试了替换Runtime Animator Controller之后,把先前的Runtime Animator Controller Destroy掉,貌似内存也没释放。

Q5:请问这个GameObject.Active的开销怎么这么高?Activate会产生堆内存分配吗?

技术分享连载36

Q1:我在UGUI里更改了Image的Color属性,那么Canvas是否会重建?我只想借用它的Color做Animation里的变化量。

Q2:AssetBundle中资源同名但实际不同,请问会在UWA的资源检测报告中被认为是冗余的吗?

Q3:Unity自带的UI Shader处理颜色时,改 _Color属性不会触发顶点重建吗?

Q4:移动游戏场景中,相同的怪物会动态合并吗?如下设置可行吗?

Q5:EventSystem.Update()占用过高怎么优化?

技术分享连载37

Q1:打包AssetBundle的时候,我发现切换场景时,即使打同一个场景的AssetBundle,它们的Hash值都是不一样的,可能是什么原因造成的呢?

Q2:当UI关闭后,Texture图片却还留在内存,是下次垃圾回收或者Resources.UnloadUnusedAssets调用的时候就会清除吗?如果想立即清除,该如何操作?

Q3:我们的游戏中,不透明渲染在总体渲染里占比较高,主要的开销在于 MeshSkinning.Render 部分,这部分的Draw Call过高,共有65个, 请问该如何优化呢?

Q4:GameObject.Instantiate()每实例化一个GameObject到场景中,会造成卡顿,有什么办法可以优化吗?就算我采用了异步加载,仍然会有稍许的卡顿感。除了缓存池,是否还有别的方法?

Q5:预设中的变量,拖拽到Inspector面板和Transform.find这两种方法对加载影响是一样的吗?

技术分享连载38

Q:我有一个关于AssetBundle资源加密问题。CreateFromMemory这里不推荐大规模使用,那是不是我们要放弃对一部分资源的加密?还是说有其它的解决办法?

Q:我想确认一下Shader的依赖打包问题。如果采用了依赖打包,A、B、C依赖了D,当我更新了D包时,A、B、C是否都要重新打包?反过来呢?

Q:关于定位游戏中冗余资源引用的问题。UWA的报告中能定位到具体的引用代码么? 在Profiler只能看到ManagedStaticReferences但是具体不到引用的位置。比如Static ClassA引用一个ClassB,ClassB上引用了一个资源,就定位不出这个引用的过程。请问这种情况下有没有比较好的方法找到引用关系呢?

Q:UGUI的SrcollView Mask遮挡不住特效,这个有没有可行的解决方案?

Q:Spine动画在NGUI的ScrollView滚动区域的层级也会出现问题,请问怎么裁剪Spine动画呢,Spine是骨骼,这不就等于给特效换Shader了吗?

技术分享连载39

Q1:我们图标现在是制作成图集后再使用的,但是当图标数量很多的时候,图集的膨胀就很厉害了。对此我们的做法有两种:1)拆为多个图集;2)不再使用图集转而使用UITexture来使用。请问UWA有什么建议呢?

Q2:我发现当把UI挪到屏幕外时,Draw Call不会减少,只有设置Enabled去掉才能减少。UI是没有遮罩剔除这类功能吗? 那是否意味着ScrollRect只能自己做动态加载或者动态设置Enabled之类的优化了?

Q3:粒子系统的Prewarm主要用来做什么的,这个怎么优化呢?

Q4:UI展示动画时,使用Mask做和使用UI本身做 ,哪个效率会更高些?

Q5:我们为了降低像素填充就限制了最大分辨率,但是发现限制之后NGUI的字体显示就变得模糊了。是否可以避免NGUI字体模糊呢?下图是我们在小米5上测试得到的结果:低分辨率下文字就模糊了。

技术分享连载40

Q1:我们有了解到,卸载AssetBundle后, 从这个AB读出资源的Instance ID和guid的映射关系会被删除。在我们的项目中, 优化策略是这样的: 进场景时, 预加载Prefab,并创建一些对象实例缓存,然后会把AB删掉。因为我们发现在Android机器上, AB占的内存很大, 如果其中纹理(A)的Instance ID被认为失效,它和guid的映射没有了,如果某个时刻,缓存池不够用,需要从Prefab创建一个新的实例,这个Prefab会引用到A,资源管理器发现这个A的guid并没有对应的实例ID, 这时会导致重新从磁盘上加载资源A,请问这样理解对吗?

Q2:UWA的测评报告上说“蒙皮网格(Skinned Mesh)数量过高”,我们游戏内很多模型动画用的是这个,是美术还可以用其他的方式做动画吗?

Q3:能否推荐一些动画剧情的插件?

Q4:我在Profiler中看到Animator.Initialize这个耗时很大,这个有什么建议么?Animator.Instance 是因为Animator过多造成的吗?

Q5:请教一下,为什么NGUI的Atlas通过AssetBudle载入之后,使用Resources.UnloadUnusedAssets()不能够释放呢?分析器里面引用是1,但是又找不到哪里引用了。

技术分享连载41

Q1:Unity UI图集不是正方形,使用PVRTC格式的话,会出现问题么?比如是512×1024的原始比例。

Q2:在GPU分析器里面看到,同一个NGUI的图集被绘制了很多次。请问是否是由于各个界面Panel不一样导致的?这种情况下如何优化?

Q3:对于NGUI而言,如果界面元素的坐标是非整数的数值,会导致界面元素模糊么?还有哪些原因会造成界面元素模糊?

Q4:怎么去掉Mesh中的Colors属性?我把FBX里的LayerElementColor字段都删了,这个Colors还是存在。

Q5:同一个场景,烘了两套 Lightmap,切换的时候有没有办法在这两套Lightmap之间实现平滑过渡?

技术分享连载42

Q:请教一下,大家把UI做Alpha分离以后,会把分离前的图删掉吗?我这边把分离前的图删掉了,但是美术反映他们无法使用分离后的图了,因为在预览窗口看不了图。但是我又不想让他们用原来的图,否则还要花精力去维护。大家都是怎么处理的呢?

Q:在加载场景依赖的所有AssetBundle 后调用LoadLevelAsync,在LoadLevelAsync调用完成后, 对所有的AssetBundle调用unload(false),不知这样是否可行。主要想减少Webstream占有的内存。 现在有个问题,场景中的特效,在几次进入视野后会丢图。 场景景物是正确的,可能是什么原因导致的呢?

Q:公共AssetBundle太大会不会影响更新包的大小?这个公共包不unload会不会导致SerlizedFile太大,卸载的话会不会导致公共AssetBundle的Asset冗余?

Q:iOS下PVRTC格式对Alpha通道的支持不是很好,凡是有渐变的图集,失真都很严重。是否把Alpha分离出来,图片的品质就会有所提升? 但是内存会比PVRTC大一倍。

Q:请教一下,SerializedFile的卸载规则是什么呢?会跟随这AssetBundle一起卸载么?

技术分享连载43

Q1:有没有什么办法可以提升Unity编辑器中代码的编译速度?我们现在每修改一次代码,等待的编译时间都将近半分钟。

Q2:关于UI开发,NGUI和UGUI究竟哪个性能更好呢?

Q3:目前所遇到的问题是在UGUI下,无法使用ECT+Alpha分离,函数中已经设置了,但是实际打出来的包并不能显示。我们所使用的Unity版本为5.4.1f,所以特此请教一下是否哪些地方我们使用的不对。

Q4:下图中WWW.LoadFromCacheOrDownload第三个参数是用来验证资源的吗? 感觉跟第二个参数有点相似(除了验证以外), WWW.LoadFromCacheOrDownload在iOS上是否有数量限制?

Q5:WWW.LoadFromCacheOrDownload只是在内存中有个引用,没有实际加载资源,调用WWW.assetbundle后也是么? 那么依赖此AssetBundle的资源加载的时候,会自动触发此AssetBundle从磁盘加载对应的引用资源么?

技术分享连载44

Q1:我们在做依赖打包改进,比如UIAtlas这种脚本,AssetBundle包里脚本没有做依赖,每个包里都有这个脚本,会导致Mono堆内存增大么?对于“脚本也是资产”这一点理解的不是很透彻。脚本在AssetBundle里是不会启动,但是会出现脚本丢失。本身没有做依赖打包的话脚本是冗余在AssetBundle中吧?

Q2:我们正在权衡是否对纹理资源进行Alpha通道分离。现在发现,Android低端机上(OPENGL ES 2.0)使用Alpha分离,内存相当是两个ETC1的大小(相对RGBA32是小了很多),但是Shader中纹理采样会执行两次,这个采样其实对低端机消耗还是蛮大的吧?在iOS上分离是没有意义的,而且分离之后使用上会变麻烦,这样权衡之下,分离Alpha只是改善内存的话,优势看起来感觉不太明显,是否有更好的说法来说明分离的优势?

Q3:如果有一个AssetBundle A内容全是UI用的图片,另外一个AssetBundle B是一个UI的Prefab,在加载UI B的时候我为了节约加载时间,自己手动加载一下AssetBundle A,但是我发现UI B的加载速度并没有加快。所以想请教一下,当从AssetBundle里把这个Prefab GameObject拿出来的时候,它的初始化过程中是从哪儿读这些图片?

Q4:求教Mesh导入后这里的uv3和uv4是怎么回事?有的模型只有uv和uv2,有的有四套。

Q5: 在UWA上周六的分享会中,我收获了不少性能优化的知识点,同时也有个疑惑,是关于“UI Mesh重构”这个话题。当时UWA说“把一个UI界面移出屏幕或者缩放是不会引起UI Mesh的重构”,但是我今天测试了一下,在UISprite上面挂了一个脚本,让它移出相机屏幕或者手动更改坐标时,发现都会出现CPU峰值,看上去确实是Mesh重建造成的。下面是我的测试截图:

技术分享连载45

Q1:我从UWA的报告中看出我们的GC比较严重,里面有我们自己GC的地方(切换场景的时候),然后就是系统GC的。这个我们无法控制,那么有什么办法优化吗?我发现一个很尴尬的地方,如果我们不自己去GC,内存好像不会返回,但是GC又会引起卡顿。

Q2:场景切换完了后,我们发现上个场景的内容并没有卸载完毕,所以我们调用了Assetbundle.Unload(true)这个函数,紧接着我们调用了UnloadUnusedAssets+GC操作帮我们清理资源(如果不调用后续两个操作的话,我发现内存曲线并没有得到明显下降),而这个时候GC次数又高了,GC次数高了CPU降低,不去GC内存得不到完整释放。我在你们网站上看到说不要开发者频繁去使用UnloadUnusedAssets+GC这个操作,所以希望得到一些帮助。

Q3:我们没有使用AssestBundle的方式,使用的都是在Resources路径下的Load,请问Resources目录下的所有内容都会加载到内存里吗?如果里面东西多,是不是会导致占用内存过高?

Q4:请问下,Unity 5.3.3版本,Android用AssetBundle.LoadFromFile读取Application.streamingAssetsPath目录下的AssetBundle文件,用什么样的地址?

Q5:Font Texture 资源是如何生成的,因为我发现好像有重复的出现,如何优化呢?

技术分享连载46

Q1:我们用AssetBundle打包。A包里面有一个界面,C包里面也有一个界面,这两个界面用到了相同的图集,我把图集单独打成了B。游戏实例化的时候,我先加载B,然后加载A,然后手动LoadA里面的一个对象,实例化一个界面。然后释放A和B,后面当需要另外一个界面的时候,我又加载B,然后加载C,然后手动LoadC里面的一个对象,实例化一个界面。现在问题是,B里面的图集,我是不需要手动Load的,这个依赖关系是Untiy去做的,但是按照我之前的做法,B里面的图集会出现2份吗?

Q2:如下图,在UWA性能报告中,我们发现Camera.Render下CreateVBO的开销较高,请问这个是如何引起的?

Q3:FK & Statemachine 状态机占用时间比较高,是否有优化的方法呢?

Q4:伤害检测、还有靠近采集物品时触发可以采集的提示箭头等,我们都使用了碰撞,请问如果不使用碰撞,可以用什么方法代替呢?

Q5:Fixed Timestamp的大小设置多少合理,对物理的开销影响大么?

技术分享连载47

Q1:对Prefab资源的卸载、预览英雄模块、需要卸载英雄角色的资源、动画和材质都可以通过Resources.UnloadAsset(xxx)来顶点清除,而Prefab不行,Prefab 只能用 Destroy + Resouces.UnloadUnused()卸载吗?

Q2:如果我用WWW加载了一个AssetBundle,创建了一块WebStream内存。这时候我用另一个东西保存这个AssetBundle的引用,然后用WWW给Dispose了,那么这块WebStream内存会释放掉么?

Q3:NGUI的UIEventListener中的OnPress与UIButton的Press状态不能对应上。具体情况是我点击某个按钮并且按住不放,UIButton处于Press状态,然后移出了Button的范围,UIButton的状态变回了Normal,而UIEventListener中的OnPress并没有监听到,必须松开点击才能监听到。它们的Press状态切换有什么不一样呢?

Q4:关于UI的Image组件的Sprite剪裁显示问题。因为Image组件上面有ImageType为Filled的选项,通过这个东西可以实现对UI的各种奇妙的显示。因为Mask组件会造成大量的Batches,单独做图会造成算是冗余内存和包体开销,那写个自定义继承Image的组件把这个效果给实现了,按道理是没有问题的,而且在翻看UGUI源代码的时候,也找到了相关片段:

Q5:我发现如果不调用UnloadUnUsedAssets这个函数,则无法销毁通过Instantiate实例化出来的材质(包括纹理)。如果我尝试用Resouces.UnloadAsset来卸载挂在GameObject上的实例化材质, 则会闪退,请问这种情况该如何解决呢?

技术分享连载48

Q1:我有一个带位移动画A,有位置有旋转的变化,需要播完这个动画后切换到一个原地的动画B。现在我发现动画A没播放就会切换到B了,导致一些位移数据并没有作用到模型上,这种情况怎么处理?

Q2:关于GC优化,Unity官方文档中有如下两个推荐的方法,请问在手游上是否适用?(1)频繁GC,隔几秒主动调用一次,保证不需要的堆内存能够及时释放。适用于对内存总量较小的情况。(2)尽量避免GC,可以考虑先撑大内存。

Q:如下图所示,什么情况下会触发MaskableGraphic.Enable() ?现在我得到的结论是只要用到了Image组件,然后禁用启用带有这个组件的物体,都会触发进而产生GC。大家都怎么显示隐藏图片这种需求的,SetActive这种方式容易产生GC。

Q:UWA建议“将较多的动态UI元素分组放在不同的UI Panel中”,那么请问如果是ScrollView里面多个item的话,是否意味着每个Item都加一个Panel会更好一些?

Q:如果我在UIPanel下面放的是Sprite Renderer而不是NGUI的Sprite,是否会引起整个UIPanel的重绘?

技术分享连载49

Q1:常用资源类型网格、材质、贴图、动画都是引用或复制+引用的方式被使用,对于那些被引用的资源,需要等引用者不再引用了才能使用Resources.UnloadAsset吗?常用的资源几乎都是引用或引用+复制的关系,所以我对这个接口的理解是用处不大,请问大家是如何使用Resources.UnloadAsset这个接口呢?

Q2:请问UWA有什么办法可以快速定位到NGUI中是哪一个Panel在LateUpdate中触发了重建操作吗?

Q3:我的游戏运行一段时间之后,已经切换到一个空场景了,然后手动调用了System.GC.Collect(); Resources.UnloadUnusedAssets();为什么还是会有这么多贴图资源被引用呢。我猜可能是由于一些脚本中的静态变量引用导致,请问有办法查出来是哪些静态变量吗?

Q4:在UWA性能测评报告中,为什么同样分辨率、同样格式的纹理资源,其内存相差一倍?表格中Mipmap的数量是怎么计算的?

Q5:请教大神们个问题,美术在制作人物模型的骨骼动画时候,一般是没有必要缩放的,但是导出的动画文件里还有这部分信息。不知道是否有优化掉的必要。如果有,有什么好方法么?

技术分享连载50

Q1:在我的UWA性能检测报告中,纹理才占50MB,但为什么Unity内存会有300MB之多,请问这部分是怎么计算的?内存大小难道不是由资源大小决定的吗?

Q2:在Android平台上,PlayerSettings里开启/关闭Multithreaded Rendering,在性能和稳定性上有多大的区别? 一般是勾还是不勾?

Q3:物体的动态合批条件和是否是透明物体没什么关系吧?比如粒子系统的物体一般都是透明的,是不是也可以合批?

Q4:在UWA报告的渲染模块中,网格数和Draw Call数量都不高,但为什么不透明渲染消耗这么高呢?我该如何进一步定位并优化这个问题呢?

Q5:关于资源冗余,我从AssetBundle中加载一张贴图后,即使Unload(false),是否还会在内存中保留一个没有被任何资源引用的贴图呢?是否非得UnloadUnusedAssets()才能把这个“僵尸”资源给卸载掉?

技术分享连载51

Q1:我最近用Deep Profiler发现项目里有一个直接调用Color != Color的接口耗时很高,而且百分比也很高(不管是Self还是Total)。但是如果用Profiler.BeginSample显示时,其耗时又很低,百分比也很低几乎等于0。这样的情况下是Deep Profiler出问题了吗?

Q2:Unity中修改了Material的一个属性后,该Object就会单独实例化出一个Material,所以它就不能被动态Batching了,是这样吗?

Q3:对于UGUI文字花屏问题,有什么推荐的解决方法吗?

Q4:SkinnedMeshRenderer的Mesh是不是不能动态修改?属性里只开放了SharedMesh。

Q5:粒子系统里面使用到的模型,是不是读写开关必须要打开,否则会崩溃?

技术分享连载52

Q1:我们的游戏中有一些静止的建筑,会和整个场景一起烘焙(包括了每个建筑在地表的阴影)。现在希望这些建筑是逐步开放的,比如玩家1级的时候只有建筑A开放,2级的时候建筑B开放,现在的问题是当建筑未开放时(SetActive(false))地表的相关阴影还在。这种问题一般是怎么处理的?

Q2:在一个场景中有很多小物件,例如花花草草之类的静止物体,造成Draw Call数量较高。在不想让美术重新出资源的前提下,我是想把相同模型的东西合并,然后把小贴图打成一个大的贴图,重新算UV。还有比这种方法更好的优化手段吗?

Q3:对于Animators.DirtySceneObjects这个参数,它是和哪些因素有关,以及如何优化?

Q4:请问Physics.Processing的占用过大一般是因为什么原因导致的?

Q5:我游戏场景里有些草,勾选了Batching Static 如下图:

技术分享连载53

Q1:请问“Dynamic Batching”这个选项开关与否对于性能影响大么?

Q2:求教一个屏幕后处理的问题。我们期望角色不受屏幕后处理影响,所以目前采用双相机的方案,根据Layer划分,但是这种情况下角色的影子也就没有办法投影到地表上,请问这种需求有什么好的实现方式?

Q3:请教Lightmap相关的优化问题。我现在的场景中有N个GameObject共用一个Prefab,烘培Lightmap时,会生成出N个Lightmap贴图。有没有办法把这些生成的Lightmap合成一张?

Q4:我的项目在一帧中进行实例化操作时,会产生大量的GC Alloc,请问这是为什么?我又该如何避免呢?

Q5:请问UGUI的重绘是针对于拥有Canvas组件的Canvas物件,还是针对于拥有CanvasRenderer组件的Panel物件?

技术分享连载54

技术分享连载55

Q1:我把多个AssetBundle打成一个大包,会出现部分粒子特效贴图丢失的问题。参数设置为CollectDependencies | DeterministicAssetBundle | UncompressedAssetBundle时,贴图是对的,但是脚本、Shader又出错了。由于Unity 4.x下AssetBundle的问题比较多,想知道打大包可行性如何?

Q2:请问,反复对一个GameObject调用SetActive(true),是否会很耗性能?

Q3:如下图,通过纹理图片通过文件流形式加载到内存,
这样的资源还可以使用Resources.UnloadUnusedAssets()和Resources.UnloadAsset(m_Asset)进行资源卸载吗?

Q4:我们有些特效的动画开始是在相机外的 , 动作的裁剪使用的AnimationCullingType.BasedOnRenderers,这样会导致特效之后在相机内也显示不出来了,除了更改如下这个选项还有其他做法么?

Q5:发现一个可能是NGUI的Bug:在某些情况下UISprite不显示,或显示的位置不符合localPosition数值Bug。 如: 在UISprite.spriteName不变,对UISprite.gameObject.localPosition或UISprite.gameObject.SetActive设置新值时无效或显示不正确,请问是什么原因?相关例子已经提交给UWA。

技术分享连载56

Q1:我们的游戏中,相邻关卡资源很相似。现在涉及到切换场景,每次都要卸载资源又加载资源,很耗时;但是如果先加载再卸载,内存峰值又会涨。请问UWA有什么建议么?

Q2:在AssetBundle打包的时候,我们是一个文件一个AssetBundle,基本不存在冗余的情况了。但这种做法是否可取?UWA有什么建议?

Q3:BuildAssetBundleOptions.DisableWriteTypeTree这个选项的实际用处是什么?

Q4:网格模型FBX文件在不开启Read/Write选项时, 如果通过StaticBatchingUtility的CombineMesh来合批的话,内存会增加么?

Q5:我的项目在加载过程时经常崩溃,项目加载代码如下。想请问这种写法是否存在问题,是否会导致崩溃?

技术分享连载57

Q1:在整体的性能消耗上,CPU和GPU各占一半合理吗?如果不是,各占多少为好?还是说需要根据机型来看?其次,我如何知道游戏在手机上的GPU消耗?Profiler是看不到的,有工具推荐吗?

Q2:UWA DAY 2017中提到“Animator优化可以把精度从8位减到3位”是什么意思?如何实现呢?

Q3:我用DestroyImmediate 和 Resource.Unload 来进行卸载Prefab,在卸载前我获取Prefab下所有的材质,发现有些文件无法卸载,类似下图中的MangedStaticReferences(),怎么卸载这些资源呢?

Q4:我们项目做AssetBundle打包时,发现如果资源所依赖的C#Script的Public成员变量有变化时,用新代码加载旧的AssetBundle就会不兼容。有没有什么方法能判断这些Script在变化时是否需要重新打AssetBundle呢?目前我们使用.CS文件的MD5来判断是否需要重新打包,但其实这样应该有很多不必要的重复打包,对吗?

Q5:Unity的材质的宏是有材质用到时才会被编译吗?还是说不手动Skip都会编译?

技术分享连载58

Q1:我们项目中有大量的特效,一个特效Prefab可能包含100-200个GameObject,每个GameObject上都挂有一个粒子系统,但是实际上很多特效只有延时和坐标旋转之类的参数的区别。我看了Prefab文件后发现每个粒子系统分别记录了各自的信息,从而导致整体文件很大,内存占用也比较大。请问是否有优化的方法?

Q2:我们游戏中用到NGUI的HUD,单位主要是一个进度条和一个倒计时文本(持续更新),同屏数量达600左右,单位本身在持续移动。现已将这些设置为独立Panel,且只有2个DrawCall(进度条所在图集和文本),但还是卡顿得很厉害,请问是否有优化的方法?

Q3:如下图,请问这几个参数的单位是什么?

Q4:如下图,这个ResampleCurves选项的作用,以及是否和对内存性能的影响?

Q5:我们美术作的人物动画,是不需要用到缩放的,于是我做了一个Scale Curve剔除。对比运行时数据如下:

技术分享连载59

Q1:关于AssetBundle(下称“AB”)拆分粒度问题。在我的项目中,我是基于逻辑以及最终的打包大小来分的,比如尽量不让压缩后的AB包超过1MB, 这是UWA之前的推荐,同时也是因为当前版本Android包的SerializedFile占用大小所考虑。经过这样的规划之后,我打包这块的代码基本是写死的, 包括手动把公共包拆成多个(公共包略大,不拆的话压缩后会有6、7MB), 还有每个AB包的内容也是人为拆成多个。 这样虽然最后功能实现了,但个人依旧觉得不够自动化。每次新添加资源的时候, 都得走一遍这种手动流程。也研究了别人写的开源方案 ,全自动分析依赖关系,但问题是最后包打得实在太细了,不太符合科学(但还是推荐大家学习)。所以就想问下各位的公司项目是如何解决这个AB 粒度划分问题的?

Q2:我之前在参加UWA讲座时,听说移动端开启多线程,把后期效果移动到渲染线程会节省后期的消耗。我测试了一下,虽然主线程中后期显示的CPU占用降低了,但是却多了Gfx.WaitForPresent的时间,最后两者相加基本还是一样的。那开启多线程这个功能,对后期到底有没有帮助呢?

Q3:为什么Unity里实例化一个Prefab会产生那么多GC Allocated?

Q4:请问动画模块中,Animators.ProcessAnimationsJob和Animators.WriteJob的CPU占用较高,请问这些与什么因素有关?

技术分享连载60

Q1:对于WWW.LoadFromCacheOrDownload(System.String url, Int32 version)这个接口的第二个参数,我知道是做缓存资源的更新用的。我们之前在Editor模式下作了一个测试:用该函数加载一个资源,Version参数设置为1,会发现在缓存目录下生成了一个对应该资源的缓存目录,这很正常。然后我们再次用这个接口加载这个资源,Version参数设置为2,现会发在缓存目录下生成一个新的对应该资源的缓存目录,并没有覆盖旧的目录。这个情况在移动平台上是否也是这样的?

Q2:我听说WWW.LoadFromCacheOrDownload(System.String url, Int32 version)这个接口加载资源,如果是Unity 4.x的版本,会有500个资源的数量限制,如果超过这个限制,Unity会删除之前缓存的每个资源,是这样吗?那在Unity 5.x 版本上是否还存在这样的问题呢?

Q3:我阅读了UWA的你应该知道的AssetBundle管理机制一文,想对其中“每次加载都涉及到解压操作”的理解进行确认:对于new WWW实际是解压到WebStream。而如果是用的LoadFromCacheOrDownload,那么资源是在磁盘,所以在调用www.assetbundle时才做解压。那么有个问题,如果使用直接获取AssetBundle的那些API,解压过程是怎样的呢?CreateFromFile是在调用assetbundle.load的时候从磁盘解压,CreateFromMemory是直接解压到WebStream?

另外,对于WebStream来说,同一个WWW对象多次调用www.assetbundle方法时,得到了栈上的多个变量,但是这些变量都指向同一个WebStream中的对象吗?

Q4:我们在内存优化时发现一个问题,编辑器版本 Unity 5.3.4p6,使用UGUI,场景A中一个Text控件使用自定义字体资源,然后把该控件Text属性勾选为空(disable),再Load一个空场景,看场景A卸载后在内存中的残留,发现有一份引用是 ManagedStaticRefrences()的 Font 内存。如果不是把Text属性disable,则场景A卸载后内存里不会再残留被引用的Font内存,请问可能是什么原因造成的呢?相关例子已经提交给UWA。

Q5:我想了解如何使用顶点色Mask控制明暗关系,才能达到类似崩坏琪亚娜效果?

技术分享连载61

Q1:Unity5.4.1中,我将需要的Shader打到一个AssetBundle包中(包含一个关联了所有Shader的Shader Variants),分别用Shader.WarmupAllShaders和ShaderVariantCollection.WarmUp两种方式进行预加载,后者耗时更少。
这里用了Standard Shader做的测试,可以看到真机上两种方式耗时差距是非常大的。 请问,确实是ShaderVariantCollection的效率更高,还是我测试方法有问题?

Q2:我们在做MMO国战类游戏,因此想咨询下资源标准。我们同屏会有70~80个玩家,这种情况下主角一般控制在多少面,多少根骨骼呢?一个Boss有80多根骨骼会有问题吗?

Q3:我们想请教一个Unity的普适性的资源管理问题。举个例子,我们现在的一个特效Prefab包含的贴图打成AssetBundle时没有单独拆分出来,就会存在一个问题,这个特效AssetBundle会存在重复加载的问题进而导致重复的特效贴图在内存中。(针对“重复加载”说明下:我们首先通过AssetBundle出来一个Object,这个Object会缓存一段时间,在这段缓存时间过后这个Object会被Destroy掉,而需要释放的特效是通过Instantiate这个Object出来的。当这个Object过了缓存时间被destroy掉后,下次需要释放相同的特效还是通过load同样的AssetBundle进行再实例化出来,这样内存中存在两份贴图了。)

Q4:我们游戏现在测试出来的GC是否合理?这个分配数值可以接受吗?是否存在泄露?如果存在泄露,有没有具体到每个函数的分配详情?

技术分享连载62

Q1:在Unity 的 Profiler里,有些记录右边会有Warning的个数信息,请问这个是否影响性能,或者是否有必要修改呢?

Q2:我们设置了TargetFrameRate为30,想避免过高的耗电和发热,请问这样做是合理的么?

Q3:我们美术在制作场景地面的时候,会有如下图所示的非常明显的一条模糊和清晰的分割线。我清楚这是由于Mipmap的使用导致的,我们不想让这条线这么明显,初步的想法是设置Texture的mipMapbias这个参数,这个参数没有在Texture的配置界面上提供。

Q4:我们使用的是Resources.Load和LoadAsync的方式加载资源,这个与AssetBundle的方式比较,能大概帮解释一下优劣么?

Q5:在Unity工程里启动游戏时,会有大量的Warning(类似定义了没有使用的变量这样的Warning)请问这个对真机的性能是否有影响,是否有必要修改掉这些Warning?

技术分享连载63

Q1:我在改血条,我原来是一个Canvas里放了所有血条,后来改成每个血条一个Canvas,再改成每个血条完全不用UGUI,直接用SpriteRenderer绘制,感觉性能越来越差了,怎么办呢?

Q2:请问下在Unity 5.6版本中如何解决预渲染缺少高光的问题?该版本中光照预渲染Directional Mode选项中少了Directional Specular选项,渲染出来的效果场景缺少高光。

Q3:我把骨骼文件的Optimize Game Objects”开启了,然后骨骼信息就没有了,那Avatar换装时候需要处理的骨骼信息怎么办?

Q4:Unity的Mono在内存不够的时候GC操作是即时触发的吗?比如说我当前Mono总内存是20MB,已用15MB(其中5MB可回收),然后我同步加载大量资源,需要9MB内存,Mono上限可能被撑大?

Q5:我在优化动画精度时发现针对Generic效果明显,而Humanoid变化不大,第一组图是Generic优化前后对比,第二组图是Humanoid,优化前后对比,这是为什么呢?

技术分享连载64

Q:Unity 5 的 Shader Variant Collection 功能是否推荐使用?我有以下3个疑点:
1)使用 Shader 变体之后,Shader 是否还能走资源更新?抑或 Shader 不推荐走资源更新?
2)Shader 变体和 Shader Always Include 的主要区别是什么?二者对内存和帧率影响如何?
3)在 Unity 5 较早的版本中,Shader 变体功能似乎有一些Bug,现在是否可靠?

Q2:请问为什么我项目渲染中Material.SetPassFast的开销这么高?这个该如何优化?

Q3:Animator会把所有状态的AnimationClip加载到内存,有什么好的办法可以动态加载?

Q4:为什么Transform.设置Parent会触发Animator的初始化吗?Parent是等于null的。

Q5:美术做粒子的时候,粒子与粒子之间共用资源的情况很多,例如某几个粒子共用一个Material,某几个粒子共用一个贴图等,应该如何组织AssetBundle?要是对应到最细的那个程度,凡是共用过的资源都单独打一个AssetBundle,好像又会很琐碎,假如不那么做,粒子与粒子之间的AssetBundle又会有冗余。这方面有什么好的建议?

技术分享连载65

技术分享连载66

Q1:我在Unity 5.5.2下用AssetBundle依赖打包,但是LoadAllAssets之后,内存中却存在两份相同的文件。

打包过程如下: 将资源A(material)打包到testmaterial.bundle,然后将纹理B打包到testtexture.bundle,再使用一个Sprite C引用纹理B后,将Spirite生成一个Prefab并将其打包到testprefab.bundle。最后导出成的3个Assetbundle之间的依赖关系为:A(testmaterial.bundle)依赖 B(testtexture.bundle),C(testprefab.bundle)依赖B(testtexture.bundle),从最后的生成的manifest也可以看出来依赖关系跟预期的一致。

Q2:Unity 5.5版本下的UGUI,我将字体设置为粗体,发现字体只是变宽不加粗,不像正常的粗体,如下图所示。另外,TestMesh Pro需要预渲染,不能用动态字体,只能用于特定范围,有像NGUI(效果还不错)那种对动态字体加粗的方法么?

Q3:这个红框里面的内存是如何生存的?是实例化生成的吗?但为什么GameObject被销毁掉之后,这部分内存也不会被释放呢?

Q4:请问UGUI Image 在切换Sprite(网络图片) 的时候有卡顿,从Profiler中看到具体卡在SpriteMeshGenerator.TraceShape 这个方法上,如下图所示,有没有什么优化的方法呢?

Q5:New出来的Mesh好像都是可读写的,在我填充完数据以后,有什么办法能把这个Mesh改为只读么?

技术分享连载67

Q1:使用AssetBundle.Unload(true)释放AnimationClip , 但发现AnimationClip在Profiler看到还存在,请问要怎样才释放干净呢?

Q2:如何处理ETC压缩完图片质量模糊和ARGB32内存占用太大这种关系?

Q3:如何降低动画文件的浮点数精度?之前UWA给过思路,但具体怎么个执行方法?

Q4:请问一下iOS平台打出来的带Profiler的包,在XCode里看内存运行期间涨了近60MB,Profile里面看ReservedTotal只涨了10MB,这个是为什么呢?测了很多次,都是xcode内存涨很多,但是资源看不到太大的变化,最后游戏可能会崩溃,求解?

Q5:UWA报告中的资源是否是实时的?我看给的是原始格式,不是压缩后的内存数值。

Unity性能优化大合集,All In One !(更新至8.18)

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注