Unity性能优化分析思路

Unity性能优化分析思路

1)Unity性能优化分析思路
​2)Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常
3)FBX默认会冗余lit.mat、lit.shader如何解决
4)部分手机(小米12)运行时不时闪退问题


这是第294篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Unity

Q:Unity有多少优化点?比如合批:静态合批、SRP合批、GPU实例化、UGUI Reruild、光照烘焙、反射探针、光照探针、Shader.Parse、Shader.CreateGPUProgram、场景加载优化和GC优化,还有哪些优化点?

A1:大方向上可以从CPU、内存、GPU这三个方向切入。

细分一下可以从CPU、内存、渲染、资源优化、耗电优化、网络优化、卡顿优化、优化工具的选择掌握这几个点入手。

一、CPU优化

  1. 缓存计算结果
  2. 预处理
  3. 限帧法
  4. 主次法
  5. 多线程
  6. 引擎模块(动画、物理、粒子、导航)
  7. 逻辑优化

二、内存优化

  1. 缓存法
  2. 内存池
  3. 资源管理器
  4. 控制GC
  5. 逻辑优化
  6. Shader变体数量优化

三、渲染优化

  1. SetPassCall渲染状态切换频次控制
  2. DrawCall数量控制
  3. 带宽负载
  4. 显存占用
  5. GPU计算量

四、卡顿优化

  1. 降帧法
  2. 摊帧法
  3. 限制数量法
  4. 逻辑优化
  5. IO优化
  6. 使用进度条

五、资源优化

  1. 纹理优化
  2. UI优化
  3. 字体优化
  4. 模型优化
  5. 场景优化
  6. 粒子优化
  7. 材质优化
  8. 指定标准美术规范
  9. Shader变体数量优化

六、耗电优化
上面说到的优化点,或多或少都会影响到手机的耗电,也是优化耗电的措施,除此之外还有:

  1. 动态调整限帧
  2. 动态调整画质

七、网络优化

  1. 减少无用字段
  2. 降低字段精度
  3. 避免重复发送
  4. 网络异步化
  5. 压缩无效字节
  6. 压缩协议包

以上说的这些要点,大部分摘抄归纳自《移动游戏性能优化通用技法》。强烈建议多花些时间认真阅读一下这篇文章,然后以这篇文章作为指南,再去仔细研究里面提到的优化细节该如何展开。

感谢马三小伙儿@UWA问答社区提供了回答

A2:优化点肯定是无穷无尽的,这里搬运UWA的客户端性能优化思路,针对常见的引擎模块的相关问题都做了分析,讲的是比较全比较透的,常见的优化难题都罗列了。

《Unity性能优化 — 物理模块》
《Unity性能优化 — 动画模块》
《Unity性能优化系列 — 资源内存泄漏》
《Unity性能优化系列—Lua代码优化》
《粒子系统优化——如何优化你的技能特效》
《Unity性能优化系列—加载与资源管理》
《Unity性能优化系列—渲染模块》
《Unity性能优化 — UI模块》
《支持资源加载分析、场景分割》
《UWA报告使用小技巧,你get了吗?》
《UWA本地资源检测更新,助你严守项目性能的每个角落!》

感谢芭妮妮@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61a0a56ed8413e18eb297ac3


ParticleSystem

Q:Unity 2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常。

在2019及其之前的版本没有这个问题。升级到2020后出现。

子节点的旋转会改变对应的缩放轴,如果x轴旋转了-90度,那么根节点缩放y轴就等于缩放了z轴。

具体见下图:

A:已找到对应官方答复:
《particle-system-behavior-changes-when-it-is-rotated-or-scaled-in-negative-axis》


2018.3b版本后不建议对Billboard节点使用旋转和非统一缩放。

感谢jiacat@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6246ad4fa43e6117d04e7f0a


Material

Q:打AssetBundle包发现会包含lit.mat、lit.shader,原因是FBX默认自带的,有尝试下面方法:

**1. 代码设置 renderer.sharedMaterials = new Material[] ,但是下次再打开Unity或Reimport,又变回lit。**

2. 监听文件变化,发现是FBX的同上操作,但是这个在打AssetBundle包时又报一些莫名其妙的错误。

请问大家都是怎么处理的?

A1:两种方式解决这个问题:

  1. 一种是美术在出资源时直接不导出材质资源。
  2. 一种是自己在Unity导入资源进程里写个批处理,在导出时默认去除掉这材质球。

不管用哪种,都需要导入后,自己在资源上做好策略管理,手动的整理好材质与Shader的目录,跟打包的策略对应。这样可以更好地做好项目规范,还能为后期资源冗余的问题做优化。前期能做好这个规范,后期关于资源冗余的问题也不会太头疼。

感谢廖武兴@UWA问答社区提供了回答

A2:在2020.3.17里面有效,不论是ReImport FBX还是重启Unity,都是有用的:

public class ProcessMaterialImport : AssetPostprocessor
{
    void OnPostprocessModel(GameObject model)
    {
        var renderers = model.GetComponentsInChildren<Renderer>();
        if (renderers == null)
        {
            return;
        }
        foreach (var renderer in renderers)
        {
            if (renderer == null)
            {
                continue;
            }
            renderer.sharedMaterials = new Material[0];
        }

        ModelImporter importer = (ModelImporter)base.assetImporter;
        if (importer != null)
        {
            if (importer.materialImportMode != ModelImporterMaterialImportMode.None)
            {
                importer.materialImportMode = ModelImporterMaterialImportMode.None;
                importer.SaveAndReimport();
            }
        }
    }
}

材质球会变成下面这样:

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62442163a43e6117d04ad8fa


Memory

Q:目前只出现在小米12手机,Android系统 12,小米系统13.0.16.0。运行后10-20分钟左右就时不时闪退。

Unity版本 2019.4.3f1 L2cpp
E/Unity: Using memoryadresses from more than 16GB of memory
(Filename: /Users/builduser/buildslave/unity/build/Runtime/Allocator/UnityDefaultAllocator.cpp Line: 120)
bool UnityDefaultAllocator::AllocationPage<(RequestType)0>(void const*) const+268) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
UnityDefaultAllocator::RegisterAllocation(void const*)+148) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
UnityDefaultAllocator::Allocate(unsigned long, int)+64) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
MemoryManager::Allocate(unsigned long, unsigned long, MemLabelId const&, AllocateOptions, char const*, int)+308) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
QueueAllocator::QueueAllocator(unsigned int, MemLabelId)+60) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncRead(AtomicNode*)+280) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncCommand(AtomicNode*)+48) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncCommandsInternal()+56) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncCommands()+56) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::AsyncResourceUpload(GfxDevice&, int, AsyncUploadManagerSettings const&)+416) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::RunCommand(ThreadedStreamBuffer&)+26744) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::RunExt(ThreadedStreamBuffer&)+44) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::Run()+136) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::RunGfxDeviceWorker(void*)+4) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
Thread::RunThreadWrapper(void*)+512) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)

A1:Unity发行日志说2019.4.15修复了这个问题,我们升级完之后基本不闪退,但是在vivo的安卓12手机上还是有问题,然后又升级到2019.4.34,目前没看到闪退。

感谢大秋衣@UWA问答社区提供了回答

A2:可参考:
https://issuetracker.unity3d.com/issues/android-il2cpp-empty-project-crashes-on-launch-with-using-memoryadresses-from-more-than-16gb-of-memory-messages

感谢Arboo@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62173e64e7172c2775f926d3

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)