Unity优化点概述

Unity优化点概述

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优化

  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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61a0a56ed8413e18eb297ac3


Shader

Q:只要在Assets中的Shader,是不是只要开始运行就会直接加进内存?

A:在Unity工程里面,Assets目录下的资源要进内存,要经历这么几个步骤:

  1. 首先是要这个资源被打包进包体里面,有这么几种情况进入包体:
  • 这个资源在Resources目录下,无论是否被引用到;
  • 这个资源直接被场景引用,比如场景中的一个材质球使用了Shader A,这个场景最终进包体了。场景进入包体,有两种情况:一种是这个场景是被加入BuildSettings里面了,另外一种情况是被打包AssetBundle了。被场景引用,还有另外一种情况,就是被场景中的脚本引用了;
  • 资源被主动或者被动进AssetBundle了;
  • 这个资源被Unity某些设置项引用了,最终打包的时候这个资源也会进包体,比如游戏启动时候的Flash纹理,或者大家比较熟悉的Always Included Shaders设置项。

上面说的4种情况应该是一个资源进包体的所有情况了。

  1. 资源进包体后,和进入内存是两回事,要进内存还需要被加载进内存。加载进内存的方式会因为前面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 Pack

2D/2.5D游戏可以看看这个插件:
Ferr2D Terrain Tool

普通2D地形可以考虑使用Unity自带的Tilemap来实现,然后最新版的Unity好像重构了本身的Terrain system。

感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/619cdd33d8413e18eb2434c2


20211129
更多精彩问题等你回答~

  1. Unity增量打包AssetBundle没变化的资源也会被重新打包
  2. 在模型有UV2的情况下开启Generate Lightmap UVs
  3. 如何实现AAB包的增量更新

封面图来源于网络


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

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