高端品牌网站建设公司,wordpress火车头采集免费版,企业营销型网站特点,网站建设问题调查UI耗时函数
1.1 Canvas.SendWillRenderCanvases
这个函数是由于自身UI的更新#xff0c;产生的耗时
1. 这里更新的是vertex 属性#xff0c;比如 color、tangent、position、uv#xff0c;修改recttransform的position、scale#xff0c;rotation并不会导致顶点属性改变…UI耗时函数
1.1 Canvas.SendWillRenderCanvases
这个函数是由于自身UI的更新产生的耗时
1. 这里更新的是vertex 属性比如 color、tangent、position、uv修改recttransform的position、scalerotation并不会导致顶点属性改变因为顶点的position是根据pivot的偏移决定的而改变其size、pivot、anchor则会修改UI的transform属性从而引发重建还包括替换图片更新文本等
2. 优化建议隔帧更新
1.2 Canvas.BuildBatch EmitWorldScreenspaceCameraGeometry 网格重建包含了UI更新比如recttransform位置的改变虽然没有UI更新但有网格重建
1. Canvas.BuildBatch:UI元素改变导致需要重新build mesh 时主线程调用该函数发起网格合并。
2. 合并的过程在子线程中实现如果网格过于复杂出现了主线程的等待则耗时会被统计到
EmitWorldScreenspaceCameraGeometry这个函数里面
3. unity 会把同一个canvas下的所有UI合并成一个mesh根据层级的不同分成多个submesh所以尽可能合批减少submesh减少drawcall
4. 优化建议增加合批、动静分离
1.3 SyncTransform
对于UI元素调用SetActivefalse改成true会导致
该Canvas下所有的同级UI元素触发SyncTransform从而导致较高的耗时。 该Canvas的父Canvas下的同级UI元素触发SyncTransform
该UI元素同级的canvas下的UI元素不会触发SyncTransform
一句话同级及父级下的UI元素除了canvas 都会SyncTransform
优化建议通过设置local scale0/1来实现相同的效果
1.4 EventSystem.Update
EventSystem组件主要负责处理输入、射线投射以及发送事件、UI的创建会自动创建相关组件处理UI点击事件。raycast target 不用就关闭它
DrawCall优化
2.1 合并图集
尽量整合并制作图集从而使得不同U元素的材质图集一致。图集中的按钮、图标等需要使用图片的比较小的UI元素完全可以整合并制作图集。当它们密集地同时出现时就有效降低了DrawCall
2.2 重叠打断合批
在同一Canvas下、材质和图集一致的前提下要避免重叠时的层级穿插。简单概括就是应使得符合合批条件的UI元素的“层级深度”相同;
这里的重叠是UI元素重叠而不是Recttransform 的重叠
2.3 Z 0
当UI元素的Z0时也会产生合批被打断的情况
加载卸载api
1.1 Shader 耗时
Shader的解析和编译耗时一般是指在Shader资源被加载进内存后触发的Shader.Parse()和Shader.CreateGPUProgram两种API的耗时
shader在进入一个场景的时候是把该场景的shader一次性全部加载进来可以通过shader变体集来优化
如果一个shader 重复打进ab包内当每个ab包被加载的时候就会产生一种耗时
1.2 Resources.UnloadUnusedAssets
Resources.UnloadUnusedAssets为Unity遍历所有资源的(gameobject、mono对象)引用情况并卸载Unused对象的API一般在场景切换时由Unity自动触发或由开发者手动调用。耗时主要体现在遍历上
优化方法
1. 减少material和粒子数量这样会减少mono对象的数量
2. 使用assetbundle.unload、resources.unloadasset 先卸载一部分资源
resources.unloadassets:只能用于卸载resource.load的单个资源比如材质球纹理等不能用来卸载gameobject、assetbundle、component因为它们是复杂的资源。
3. 如果不切换场景尝试在每5-10分钟调用一次该方法释放内存 1.3 异步加载优先级
异步加载是很多项目中场景切换时加载资源的做法但往往受Application.backgroundLoadingPriority这一API的默认设置限制而效率低下
异步方法
Scenemanager.LoadSceneSync、Scenemanager.UnLoadSceneSync
Assetbundle.LoadAssetSync、Resources.LoadAssetSync
异步加载优先级Application.backgroundLoadingPriority:限制主线程的集成时间单帧内最长可用异步操作时间unity 中默认设置为BelowNormal异步加载是在后台加载线程中进行数据读取和反序列化然后在主线程中对其调用调用的方式取决于加载的资源类型比如Texture 、Meshes 是上传到GPU对其绘制 audio clips 准备 playing.
ThreadPriority.Low - 2msThreadPriority.BelowNormal - 4msThreadPriority.Normal - 10msThreadPriority.High - 50ms
体现到profiler中的函数为Application.IntegrateAssetslnBackground的耗时 优化方向 异步加载时处于战斗场景:设置调高会增加主线程耗时,可能影响性能异步加载时处于加载界面:建议设置调高,尽量缩短加载时间
1.4 加载和卸载AssetBundle
加载assetbundle的方法
Load From Memory:
Load From File Load From Stream DownLoadHandlerAssetBundle
压缩格式
BuildAssetBundleOptions.None:使用LZMA算法压缩BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4算法压缩LZMA:stream-based,只支持顺序读取,加载需要将整个包解压LZ4:chunk-based,支持随机读取,加载速度快
1.5 实例化和销毁对象
频繁大量的实例化和单次实例化过长都是可能困扰开发者的性能问题而缓存池、分帧加载等策略和技巧可能获得良好的优化效果。