Unity性能优化
小郭起床写博客
喜欢做游戏,数据可视化,服务器
展开
-
总体性能——渲染模块性能
版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]上述图例中,不透明渲染开销高,对应的画面为打斗画面;半透明物体的渲染: 整个半透明的渲染,包括树、草、UI; 如果使用的是NGUI,看下Mesh转载 2017-05-23 20:51:13 · 332 阅读 · 0 评论 -
Q&A——UI输入(一)
UI输入Q1:在使用NGUI时,我们通常会将很多小图打成一个大的图集,以优化内存和Draw Call。而在UGUI时代,UI所使用的Image必须是Sprite;Unity提供了SpritePacker。 它的工作流程和UGUI Atlas Paker有较大的差别。在Unity Asset中,我们压根看不到图集的存在。 问题是:1. SpritePacker大概的工作机制是什么样的转载 2017-05-24 17:35:43 · 802 阅读 · 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-05-24 17:36:14 · 272 阅读 · 0 评论 -
Q&A——光照贴图
Q1:Lightmap在PC上显示正常,但是转到Android平台上存在色差,颜色普遍偏暗。一般来讲,有两种情况可能会导致色偏和亮度差异。1.Unity烘焙的Lightmap是32bit的HDR图,而移动设备通常不支持HDR图(32bit per channel),会按照LDR图(8bit per channel)的形式进行处理,因此会出现色偏问题。因此我们建议:在转载 2017-05-24 17:36:47 · 606 阅读 · 0 评论 -
Q&A——AssetBundle(资源打包)
Q1:如果我有一个Prefab,它的Dependencies都在Resources文件夹中,那么,当我在AssetBundle打包时,只打包这个Prefab(不指定BuildAssetBundleOptions.CompleteAssets和BuildAssetBundleOptionsCollectDependencies)的话,这个Prefab能够正确实例化吗?这是不能正确实例化的转载 2017-05-24 17:37:14 · 326 阅读 · 0 评论 -
Q&A——骨骼优化
骨骼优化Q1:勾选了“Optimize GameObject”这个选项后,虽然性能优化了,可骨骼的TransForm会消失,有些需求又是需要在某个骨骼的TransForm上面挂特效的,这种情况下有什么比较好的处理方案吗?在选择Optimize GameObjects后,可在Extra Transforms中加入你想挂载特效的骨骼结点,这样该骨骼结点将不会进行优化处理,即其Trans转载 2017-05-24 17:37:47 · 358 阅读 · 0 评论 -
Q&A——性能优化(一)
性能优化Q1:如图,我们在UI打开或者移动到某处的时候经常会观测到CPU上的冲激,经过进一步观察发现是因为Instantiate产生了大量的GC。想请问下Instantiate是否应该产生GC呢?我们能否通过资源制作上的调整来避免这样的GC呢?如下图,因为一次性产生若干MB的GC在直观感受上还是很可观的。准确的说这些 GC Alloc 并不是由Instantiate 直转载 2017-05-24 17:38:36 · 891 阅读 · 0 评论 -
Q&A——图形渲染(二)
图形渲染Q1:以前端游时代,材质根据Pass不同、光照环境不同可以离线预编译成ShaderCache,运行时并不需要拼材质再实时编译,只要加载二进制代码就好了。那Unity有没有做这件事呢?我们是根据平台和环境预编译的Shader。对于支持 Binary Shader 加载的设备,在首次编译某个 Shader 的时候是会生成其对应的 Binary Shader Cache ,生转载 2017-05-24 17:39:26 · 609 阅读 · 0 评论 -
Q&A——资源管理(二)
资源管理Q1:Prefab中的GameObject的tag设置为EditorOnly仍然会被打进Resoures包吗?有其它EditorOnly方案吗?EditorOnly理论上只对场景中的 GameObject起效。因此 Project 目录中的 Prefab 打上 EditorOnly 后,放在 Resources 目录下依然会被打进游戏包中。但只要将其放在 Resourc转载 2017-05-24 17:40:07 · 734 阅读 · 0 评论 -
Q&A——资源管理(三)
资源管理Q1:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗?这是可以的,但非常有限。因为不通过 AssetBundle 加载,只能通过 Unity 提供的有限的接口来直接加载外部资源,如通过 WWW.audioClip 直接加载 mp3文件,通过 WWW.texture 直接加载转载 2017-05-24 17:40:47 · 749 阅读 · 0 评论 -
Q&A——资源管理(四)
资源管理Q1:Unity 5.x 能把指定集合的Mesh烘焙到一张Lightmap里吗?Unity 5.x 是没有这样的功能项的。据我们的判断,这样的需求通常是为了动态加载,因此可以尝试将Mesh分组到不同的场景分别烘焙。而在加载时可通过脚本动态地合并Lightmap,同时将物件的Lightmap Index进行正确的偏移即可。资源管理Q2:转载 2017-05-24 17:41:50 · 468 阅读 · 0 评论 -
Q&A——资源管理(五)
资源管理Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的?SerializedFile是AssetBundle加载时产生的序列化信息,一般为LoadFr转载 2017-05-24 17:42:30 · 527 阅读 · 0 评论 -
Q&A——UI输入(二)
UI输入Q1:关于UI的Mask遮挡特效,能否提供一些解决思路呢?目前由于UI与粒子系统是两个相对独立的模块,因此两者的Mask遮挡并没有简单直接的方法。我们建议从以下几种方式来考虑实现:将粒子系统转为序列帧,通过纯UI的方式来实现;通过RenderTexture,添加一个相机来实现方形的“裁剪”;参考UI的内置Shader,编写一个受Stencil B转载 2017-05-24 17:43:08 · 426 阅读 · 0 评论 -
Q&A——资源管理(六)
资源管理Q1:请教个问题,我用Unity 5 里提供的Sprite Packer把A.png,B.png打进一张图集,在运行时我怎么方便地加载这两张图呢?使用场景:某个Image控件根据不同的条件显示A,或者显示B。目前通常是在脚本序列化信息中保留这两个Sprite的引用,在切换时直接通过对Image.sprite进行赋值来切换。资源管理转载 2017-05-24 17:44:58 · 412 阅读 · 0 评论 -
Q&A——内存管理(三)
内存管理Q1:有没有办法可以减少游戏中Mono内存占用的大小?我现在读完游戏表以后就占用了60MB,我看其他游戏读完配置表也才10MB左右,这个是怎么做到的呀?如果刚进入游戏后,Mono堆内存就达到了60MB,那么你的游戏项目极有可能在一开始加载了一个非常大的配置表。对此,我们建议出现该问题的研发团队对配置文件的初始加载进行详细检测,查看是否可以精简配置文件信息。如果不行,则尝试将转载 2017-05-24 17:45:45 · 519 阅读 · 0 评论 -
Q&A——资源管理(七)
资源管理Q1:我想请教一下,下图这个函数中,每次我都申请了一个List temp = list();在这里存放6KB的数据,但是如果不做GC处理,这6KB是否就一直累加,直到做GC处理了才会释放掉,是这样么?如果调用次数很多,每次都调用一点点,也会推高内存占用吗?A:是的,这个6KB堆内存会随着Update的执行一直分配内存,所累积的堆内存会在GC触发时进行销毁。一般来说,研发转载 2017-05-24 17:47:45 · 797 阅读 · 0 评论 -
Q&A——开发技巧(一)
开发技巧Q1:我移动一个物体从A点到B点,当到达B点后执行另一个事件。我现在是每帧计算物体到B点的距离,当距离小于某个值后算是到达,感觉有点浪费。有没有什么推荐的办法呢?如果每帧只进行一次距离上的判断计算,那么该耗时开销本身是很小的。当然,开发团队可以在B点放置一个Trigger,当A进入Trigger后,通过其回调函数来进行物体的后续操作。转载 2017-05-24 17:48:23 · 994 阅读 · 0 评论 -
Q&A——资源管理(八)
资源管理Q1: 我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出现。(Shader都在一个AssetBundle文件中,都是常驻内存的,不会删掉)是必须使用ShaderVariantCollection来加载Shader吗?A:以上这种问题的较大可能是:Shader被打包到不同AssetBundle中了,WarmupA转载 2017-05-24 17:49:40 · 654 阅读 · 0 评论 -
Q&A——内存管理(二)
内存管理Q1:我们在Profiler中发现了一个AssetDatabase的内存占用,其存在于Assets中,单个占用内存非常大。 请问该占用是如何发生的呢?是否可以避免?理论上开发者在真机运行项目时是不会看到此选项的,只有在 Editor 中运行时能看到。由于在 Editor 下运行游戏时,Profiler 中获取的内存是包含了 Editor 本身占用的内存的,因此并不准确,转载 2017-05-24 17:35:06 · 296 阅读 · 0 评论 -
Q&A——物理性能
物理性能Q1:UWA的报告中指出我们所使用的刚体超出了限制,我们经过测试发现只要使用CharacterController就会产生一个隐藏的刚体。而我们的角色移动是会使用CharacterController的。 为了避免这种情况,我们使用了CapsuleCollider来替代CharacterController接受点击,同时使用设置位置的方法来替代CharacterControll转载 2017-05-24 17:32:30 · 268 阅读 · 0 评论 -
Q&A——运行性能(一)
运行性能Q1:如下图,我们发现WaitingForJob这个函数消耗过高导致了卡顿,请问该卡顿是否由于渲染压力过大导致?从图中看,该线程最后是在等待 Canvas.sortjob,而这是 UI 排序造成的开销(自Unity5.2版本开始,UGUI的部分计算已经移出了主线程)。详情参考:http://blogs.Unity3D.com/2015/09/07/mak转载 2017-05-23 21:09:23 · 497 阅读 · 0 评论 -
总体性能——渲染模块性能
版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]上述图例中,不透明渲染开销高,对应的画面为打斗画面;半透明物体的渲染: 整个半透明的渲染,包括树、草、UI; 如果使用的是NGUI,看下Mesh转载 2017-05-23 20:52:32 · 308 阅读 · 0 评论 -
总体性能——物理模块性能
版权声明:本文为博主原创文章,未经博主允许不得转载。CPU均值:物理引擎每帧的平均CPU耗时。对于Unity引擎而言,其4.X版本所使用的物理引擎为NVIDIA PhysX2.8,报告中统计的是Physics.Simulate的CPU耗时;其5.X版本所使用的物理引擎为NVIDIA PhysX3.3,报告中统计的是Physics.Simulate和Physics.Proce转载 2017-05-23 20:53:40 · 228 阅读 · 0 评论 -
总体性能——动画模块性能
Animator.ApplyOnAnimatorMove:调用次数太多说明场景中角色数量太多了;Animator.ProcessAnimationJob:关于AnimationClip的采样和读取;WaitingForJob:Unity5.X已经将其放入了子线程,等待子线程的处理;角色的多少和AnimationClip的复杂程度影响耗时;Animators.Fire转载 2017-05-23 20:54:32 · 1226 阅读 · 0 评论 -
总体性能——粒子系统性能
版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]查看屏幕中粒子的占比:GPU性能中Overdraw功能:填充数:每一帧填充多少个像素值;(M:百万)(数值高说明:区域内覆盖半透明物体的数量特别多,显得特别亮和红(特效或UI等),要重点优化)填充倍数:每一帧屏幕被刷新了多少回;转载 2017-05-23 20:55:18 · 288 阅读 · 0 评论 -
总体性能——UI模块性能
版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]NGUI:如何定位:UIRect.Update:UIWidget很多的时候,开销比较高;(UI模块或屏幕进行缓存,当缓存时,有大量UI在屏幕外边,虽然降低了UIPanel.LateUpdate,但UIRect.Update(下面有UIWidge转载 2017-05-23 20:56:26 · 370 阅读 · 0 评论 -
总体性能——加载模块性能
版权声明:本文为博主原创文章,未经博主允许不得转载。GameObject数量、资源数量多时,Resources.UnloadUnusedAssets CPU耗时比较高;Loading.UpdatePreloading CPU耗时:Application.LoadLevelAsync:通过API,调用加载场景的耗时;GC.Collect:垃圾的转载 2017-05-23 20:57:15 · 1608 阅读 · 0 评论 -
总体性能——GC调用
版权声明:本文为博主原创文章,未经博主允许不得转载。GC调用频率(帧/次):项目运行时平均多少帧会触发一次GC操作。该值越低,表示GC触发得越快,即项目运行时卡顿次数越多。推荐值:1000帧/次 一般在切场景时调用或手动去调用;如果堆内存分配合理,就不用手动调用,由Mono自动进行触发;优化方法:1: 优化堆内存;转载 2017-05-23 20:59:10 · 1036 阅读 · 0 评论 -
GPU性能——Overdraw功能
Overdraw功能:总填充数峰值:项目运行过程中,单帧总填充像素数量的最大值;(M表示百万,20M就是说有一帧内填充了2000万个像素) 填充倍数峰值:项目运行过程中,单帧的最大填充倍数。(10.0X相当于在这一帧屏幕刷新了10遍)单帧填充倍数=该帧总填充数 / 该帧渲染相机的分辨率.转载 2017-05-23 21:00:14 · 4751 阅读 · 0 评论 -
Unity手游性能测评报告——MOBA篇
MOBA移动游戏性能分析报告:渲染、UI和逻辑代码是性能头号杀手!UWA曾经发布过MMORPG 和 ARPG 的Unity手游性能测评报告,延续该系列,最近UWA对提交测试(登陆www.uwa4d.com)的所有MOBA手游进行了客观的分析和汇总,并将其具有属性特征的几大性能模块数据在此分享,希望能给相关行业的研发人员一些更为明确和建设性的意见。◆◆◆总体性能转载 2017-05-23 21:01:26 · 1984 阅读 · 0 评论 -
NGUI开发优化技巧(上)
UGUI和NGUI的区别:使用率:NGUI占大多数,NGUI和UGUI的使用占比为81% : 19%;易用性:NGUI占一定优势,UGUI仍在慢慢改善;性能:如果都合理搭配,UGUI在性能上还是有一点优势的,在Unity5.2、5.3之后UGUI有一部分网格合并的操作是放在多线程中进行,相对来讲,性能有一定的提升;但NGUI的优化相对更简单一些,主要是因为NGU转载 2017-05-23 21:03:05 · 1556 阅读 · 0 评论 -
NGUI开发优化技巧(下)
[+]NGUI更新开销:NGUI进行自身的数据更新以及生成网格的过程中所产生的开销,目前UI部分的CPU耗时大部分都是这部分的开销;NGUI的更新开销几乎全部来源于UIPanel.LateUpdate中;一般超过3~4ms,说明这部分更新开销较高;UI更新的数量和频率通过合理的布局,可以把这部分的开销限制在很多小的范围里面;在转载 2017-05-23 21:04:01 · 548 阅读 · 0 评论 -
Q&A——内存管理(一)
内存管理Q1:如图,在Editor中查看Profiler里的内存详细信息,发现Used Total中有个“Unity”,请问是什么意思?为什么会特别大?在Editor中运行时,“Unity”大是正常的,因为在Editor中运行项目时,引擎包含了所有的资源占用的内存(除了部分纹理和Mesh是在GFX中),同时自身会进行很多的辅助操作来记录各种游戏运行信息。一般来说,在查看转载 2017-05-23 21:04:40 · 392 阅读 · 0 评论 -
Q&A——资源管理(一)
资源管理Q1:iOS上PVRTC不支持NPOT的贴图压缩,在Android上可以用ETC2,但在iOS上不能压缩,内存消耗大。请问在iOS上有没有好的处理方案?ETC2仅能在支持OpenGL ES3.0的手机上进行使用,请研发团队在使用前谨慎考察支持ES3.0的手机在国内的覆盖范围。PVRTC不支持NPOT的贴图压缩,这是Apple规定的,上层应用无权对此更改。我们仅能建议将纹转载 2017-05-23 21:05:31 · 429 阅读 · 0 评论 -
Q&A——资源加载(一)
资源加载Q1:怎样动态加载Navmesh?目前Navmesh不支持动态加载,只能随场景一起加载, 因此可以考虑将带有Navmesh的场景打包成AssetBundle,然后使用LoadLevel加载AssetBundle中的场景。Navmesh的动态加载已经在Unity的Roadmap中。而当前,Navmesh是和场景绑定的,也就是说目前只能通过LoadLevel(不支持Load转载 2017-05-23 21:06:21 · 276 阅读 · 0 评论 -
Q&A——图形渲染(一)
图形渲染Q1:当关闭预渲染GI时会出现IndirectResolution,这个参数有什么用,为什么调大了以后会大大增加渲染时间,但是烘培出来却没有什么效果。该值主要控制的是GI的烘焙密度,数值越大,表示每个单位距离内的Texel越多,即烘焙得越精致,自然烘焙的时间也越长。该值并非越大越好,场景越小建议该值越低。该值为1时,对于多数场景,其烘焙效果已经足够了,升高该值,转载 2017-05-23 21:07:10 · 466 阅读 · 0 评论 -
Q&A——UI
UIQ1:能否在NGUI多分辨率适应方面提供一些解决方案或者思路?多分辨率适应涉及到以下几个方面:布局。通常可以通过 NGUI 中的 Anchor 组件来实现,能够保证 UI 到屏幕上指定锚点的距离;UI 背景图比例。通常我们建议将背景图的长宽比放大,以适配不同长宽比的屏幕,但要注意两边需要留空,或者保留可被裁掉的元素;UI 的整体缩放。可以通过 UIR转载 2017-05-23 21:07:44 · 304 阅读 · 0 评论 -
Q&A——NGUI
NGUIQ1:NGUI变形,如下图走样了,请问是不是图片压缩导致的?当UI纹理在设备上的显示分辨率低于原始分辨率时,会因为出现aliasing现象,导致UI局部变形。通常对于粗线条、块状的UI图素,变形通常是不明显的,但对于细线条的UI图素,则可能非常明显。通常该问题可以考虑三种方式来改善:在NGUI中将UIRoot的Scalin转载 2017-05-23 21:08:44 · 248 阅读 · 0 评论 -
Q&A——性能优化(二)
性能优化Q1:Draw Call和Setpass Call,这两个指标主要是看哪一个?关于这点众说纷纭,很多地方都是说看SetPass Call,但是在UWA的性能测试中,还是把Draw Call当成唯一指标。在 Unity 5.x 中,SetPass Call与 Draw Call相比,SetPass Call的指标与性能相关性更大(比如Static Batchi转载 2017-05-24 17:50:36 · 1075 阅读 · 0 评论