Unity优化点概述
- 作者:admin
- /
- 时间:2021年12月01日
- /
- 浏览:3007 次
- /
- 分类:厚积薄发
1)Unity优化点概述
2)Unity Assets下的Shader加载到内存需要满足什么样的条件
3)URP内置Shader生成的变体太多问题
4)常见的Unity地形编辑插件
这是第277篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Unity
Q:Unity有多少优化点?
A:大方向上可以从CPU、内存和GPU这三个方向切入。细分一下可以从CPU、内存、渲染、资源优化、耗电优化、网络优化、卡顿优化和优化工具的选择掌握这几个点入手:
一、CPU优化
- 缓存计算结果
- 预处理
- 限帧法
- 主次法
- 多线程
- 引擎模块(动画、物理、粒子、导航)
- 逻辑优化
二、内存优化
- 缓存法
- 内存池
- 资源管理器
- 控制GC
- 逻辑优化
- Shader变体数量优化
三、渲染优化
- SetPassCall渲染状态切换频次控制
- DrawCall数量控制
- 带宽负载
- 显存占用
- GPU计算量
四、卡顿优化
- 降帧法
- 摊帧法
- 限制数量法
- 逻辑优化
- IO优化
- 使用进度条
五、资源优化
- 纹理优化
- UI优化
- 字体优化
- 模型优化
- 场景优化
- 粒子优化
- 材质优化
- 指定标准美术规范
- Shader变体数量优化
六、耗电优化
上面说到的优化点,或多或少都会影响到手机的耗电,也是优化耗电的措施,除此之外还有:
- 动态调整限帧
- 动态调整画质
七、网络优化
- 减少无用字段
- 降低字段精度
- 避免重复发送
- 网络异步化
- 压缩无效字节
- 压缩协议包
以上说的这些要点,大部分摘抄归纳自《移动游戏性能优化通用技法》。
强烈建议多花些时间认真阅读一下这篇文章,然后以这篇文章作为指南,再去仔细研究里面提到的优化细节该如何展开。
感谢马三小伙儿@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61a0a56ed8413e18eb297ac3
Shader
Q:只要在Assets中的Shader,是不是只要开始运行就会直接加进内存?
A:在Unity工程里面,Assets目录下的资源要进内存,要经历这么几个步骤:
- 首先是要这个资源被打包进包体里面,有这么几种情况进入包体:
- 这个资源在Resources目录下,无论是否被引用到;
- 这个资源直接被场景引用,比如场景中的一个材质球使用了Shader A,这个场景最终进包体了。场景进入包体,有两种情况:一种是这个场景是被加入BuildSettings里面了,另外一种情况是被打包AssetBundle了。被场景引用,还有另外一种情况,就是被场景中的脚本引用了;
- 资源被主动或者被动进AssetBundle了;
- 这个资源被Unity某些设置项引用了,最终打包的时候这个资源也会进包体,比如游戏启动时候的Flash纹理,或者大家比较熟悉的Always Included Shaders设置项。
上面说的4种情况应该是一个资源进包体的所有情况了。
- 资源进包体后,和进入内存是两回事,要进内存还需要被加载进内存。加载进内存的方式会因为前面4种进包体的方式相对应,各不相同:
- 需要调用Resources.Load进行加载;
- 需要调用SceneManager.Load进行场景加载,如果是场景打包进入AssetBundle中,那么需要先加载这个场景的AssetBundle,再SceneManager.Load加载场景;
- 直接AB.LoadFrom加载AssetBundle,再AB.LoadAsset加载资源;
- 通常在设置项设置的资源,Unity引擎会自动进行加载内存的管理,不同的设置项,时机不同。
感谢小ben@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/619cce5ed8413e18eb241eb5
Shader
Q:打包时URP的Shader变体竟然有2w个,我有什么办法优化下吗?有什么办法可以查看用了哪些内置Shader的变体吗?
A1:变体一般分为multi_compile和shader_feature。multi_compile会把所有可能变体的可能性都生成一遍,shader_feature在Build的时候只会打包用到的Keyword。
建议替换成shader_feature,但是有一些代码启动的Keyword在Build的时候Unity不知道,需要手动加入Shader Variant Collection中。
UWA有一个本地资源检测工具可以看,然后内置的Shader可以去Unity官网上下载到本地,然后再进行修改。
感谢萧小俊@UWA问答社区提供了回答
A2:当然减Feature是肯定的,当减不掉的时候可以试试这个:继承IPreprocessShaders然后实现public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList data) 进行 data.RemoveAt(i);
代码地址:
https://docs.unity3d.com/ScriptReference/Build.IPreprocessShaders.OnProcessShader.html
感谢夏霖锐@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/619dc0fdd8413e18eb255f6c
Terrain
Q:Unity地形的解决方案有什么?是用插件吗?用什么插件?
A:首先看地形要做什么,如果要做大世界动态加载的,建议还是找美术使用3D软件制作,然后程序来处理。如果只是单纯需要一个地形来承载游戏玩法,可以考虑用一些开箱即用的插件。
如果要快速生成一个还不错的写实风格的地形可以考虑使用:
Gaia 2 - Terrain & Scene Generator如果要LowPoly,可以看看这个插件:
Low Poly Ultimate Pack2D/2.5D游戏可以看看这个插件:
Ferr2D Terrain Tool普通2D地形可以考虑使用Unity自带的Tilemap来实现,然后最新版的Unity好像重构了本身的Terrain system。
感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/619cdd33d8413e18eb2434c2
20211129
更多精彩问题等你回答~
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)