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优化
- 缓存计算结果
- 预处理
- 限帧法
- 主次法
- 多线程
- 引擎模块(动画、物理、粒子、导航)
- 逻辑优化
二、内存优化
- 缓存法
- 内存池
- 资源管理器
- 控制GC
- 逻辑优化
- Shader变体数量优化
三、渲染优化
- SetPassCall渲染状态切换频次控制
- DrawCall数量控制
- 带宽负载
- 显存占用
- GPU计算量
四、卡顿优化
- 降帧法
- 摊帧法
- 限制数量法
- 逻辑优化
- IO优化
- 使用进度条
五、资源优化
- 纹理优化
- UI优化
- 字体优化
- 模型优化
- 场景优化
- 粒子优化
- 材质优化
- 指定标准美术规范
- Shader变体数量优化
六、耗电优化
上面说到的优化点,或多或少都会影响到手机的耗电,也是优化耗电的措施,除此之外还有:
- 动态调整限帧
- 动态调整画质
七、网络优化
- 减少无用字段
- 降低字段精度
- 避免重复发送
- 网络异步化
- 压缩无效字节
- 压缩协议包
以上说的这些要点,大部分摘抄归纳自《移动游戏性能优化通用技法》。强烈建议多花些时间认真阅读一下这篇文章,然后以这篇文章作为指南,再去仔细研究里面提到的优化细节该如何展开。
感谢马三小伙儿@UWA问答社区提供了回答
A2:优化点肯定是无穷无尽的,这里搬运UWA的客户端性能优化思路,针对常见的引擎模块的相关问题都做了分析,讲的是比较全比较透的,常见的优化难题都罗列了。
《Unity性能优化 — 物理模块》
《Unity性能优化 — 动画模块》
《Unity性能优化系列 — 资源内存泄漏》
《Unity性能优化系列—Lua代码优化》
《粒子系统优化——如何优化你的技能特效》
《Unity性能优化系列—加载与资源管理》
《Unity性能优化系列—渲染模块》
《Unity性能优化 — UI模块》
《支持资源加载分析、场景分割》
《UWA报告使用小技巧,你get了吗?》
《UWA本地资源检测更新,助你严守项目性能的每个角落!》
感谢芭妮妮@UWA问答社区提供了回答,欢迎大家转至社区交流:
fbx默认会冗余lit.mat、lit.shader如何解决? -- UWA问答:帮助开发者找到更好的答案
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问答社区提供了回答,欢迎大家转至社区交流:
fbx默认会冗余lit.mat、lit.shader如何解决? -- UWA问答:帮助开发者找到更好的答案
Material
Q:打AssetBundle包发现会包含lit.mat、lit.shader,原因是FBX默认自带的,有尝试下面方法:
1. 代码设置 renderer.sharedMaterials = new Material[] ,但是下次再打开Unity或Reimport,又变回lit。
2. 监听文件变化,发现是FBX的同上操作,但是这个在打AssetBundle包时又报一些莫名其妙的错误。
请问大家都是怎么处理的?
A1:两种方式解决这个问题:
- 一种是美术在出资源时直接不导出材质资源。
- 一种是自己在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问答社区提供了回答,欢迎大家转至社区交流:
fbx默认会冗余lit.mat、lit.shader如何解决? -- UWA问答:帮助开发者找到更好的答案
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问答社区提供了回答
感谢Arboo@UWA问答社区提供了回答,欢迎大家转至社区交流:
fbx默认会冗余lit.mat、lit.shader如何解决? -- UWA问答:帮助开发者找到更好的答案
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)