搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Cpp五条
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
10分钟设置免费远程桌面_免费 远程桌面
2
Quartz集群调度出现的WARN警告问题_clustermanager: detected 1 failed or restarted ins
3
Uipath学习(3):Uipath工作流
4
全文索引详解(基于InnoDB引擎)
5
区间预测 | MATLAB实现ARIMA时间序列预测_matlab arima
6
OpenAI发布Sora技术报告深度解读!真的太强了!
7
kali Linux 2020中文汉化,一次成功!_kali linux汉化教程
8
JS第一天 之 走进JS_javascript 曾用名
9
element-UI_studyrecords_el-form-item prop属性
10
数据结构-排序_void shellsort(int arr[],int n) { int gap=n/2; whi
当前位置:
article
> 正文
Unity移动端的性能优化_grabpass commandbuffer.blit
作者:Cpp五条 | 2024-02-21 18:37:18
赞
踩
grabpass commandbuffer.blit
1.渲染
利用reflect probe代替反射、折射,尽量不用RTT、GrabPass、RenderWithShader、CommandBuffer.Blit (BuiltinRenderTextureType.CurrentActive...)
建立统一后处理框架(bloom、hdr、DOF等)代替多后处理,可以共用模糊函数,减少多次blit;另外要注意RTT的尺寸。
空气折射、热浪扭曲等使用GrabPass不是所有硬件都支持,改为RTT或者后处理来优化。
建立统一shader材质代替单一shader,充分利用shader_feature、multi_compile,并将宏开关显示于界面。
图像混合代替多通道纹理,阴影投射、阴影接收、MetaPass、forwardadd 等pass不需要时要剔除。
少用alpha test、discard、clip、Alpha Converage等,因为会影响Early-Z Culling、HSR的优化。
避免Alpha Blend穿透问题(权重混合、深度剥离等透明排序方法代价太大了)。
光照贴图代替动态阴影、尽量不用实时光;阴影贴图、环境贴图用16位代替32位;利用projector+rtt或者光圈代替实时阴影。
将环境参数(风、雨、太阳)等shader全局参数统一管理。
非主角可以用matcap代替pbr、无金属不一定要用pbr,仔细选择物理渲染所用的FDG(F:schlick、cook-torrance、lerp、要求不高用4次方,D:blinn-phong、beckmann、GGX、GGX Anisotropic,G:neumann、cook-torrance、Kelemen、SmithGGX;standard shader要注意选择BRDF1-BRDF3),渲染要求不高时不用GGX;可以用LH来优化GGX。
用fixed、half代替float,建立shader统一类型(fixed效率是float的4倍,half是float的2倍),小心选择shader变量的修饰(uniform、static、全局),选择Mobile或Unlit目录下shader
使用高低配渲染,内存足够时可以考虑开启mipmap
使用surface shader注意关掉不用的功能,比如:noshadow、noambient、novertexlights、nolightmap、nodynlightmap、nodirlightmap、nofog、nometa、noforwardadd等
standard shader的变体太多(3万多),导致编译时间较长,内存占用也很惊人(接近1G),如果使用要关掉没用的shader_feature,比如:_PARALLAXMAP、SHADOWS_SOFT、DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE、_DETAIL_MULX2、_ALPHAPREMULTIPLY_ON;另外要去掉多余的pass
shaderforge、Amplify Shader Editor生成的shader有多余代码要程序专门优化,Amplify Shader Editor功能更强大一些,而且开源,建议学习。
不要用unity自带terrian,因为即使只用3张splat图,shader也是对应4个的,建议T4M或者转为mesh。
模型和材质相同且数量巨大时用Instance来优化,比如草。
利用查找纹理(LUT)来优化复杂的光照渲染,比如:皮肤、头发、喷漆等。
尽量不要使用Procedural Sky,计算瑞丽散射和米氏散射效率比较低。
尽量不要使用speedtree,改为模型加简单树叶动画,不过SpeedTreeWind.cginc里面的动画函数很丰富,TerrianEngine中的SmoothTriangleWave很好用。
多用调试工具检查shader性能,常用工具有:FrameDebug、Nsight、RenderDoc 、AMD GPU ShaderAnalyzer / PVRShaderEditor、Adreno Profiler 、腾讯Cube、UWA等;另外可以内置GM界面,比如开关阴影,批量替换shader等方便真机调试。
2.脚本
减少GetComponent、find等查找函数在Update等循环函数中的调用、go.CompareTag代替go.tag 、
减少SendMessage等同步函数调用;减少字符串连接;for代替foreach,5.5以后版本foreach已经优化过了;少用linq;
大资源改为异步加载
合理处理协程调用
将AI、网络等放在单独线程
发布优化:关闭log、剔除代码
伪随机
脚本挂载类改为Manager等全局类实现
lua中尽量不实现update、fixedupdate等循环函数,lua和csharp互调用的效率比较低。
3.内存管理
池子管理粒子、float UI等小资源,频繁地GC会造成卡顿
必要时主动调用GC.Collect()
按照不同资源、不同设备管理资源生命周期,Resources.Load和Assetbundle统一接口,利用引用计数来管理生命周期,并打印和观察生命周期。保证资源随场景而卸载,不常驻内存,确定哪些是预加载,哪些泄漏。
内存泄漏(减少驻留内存):Container内资源不remove掉用Resources.UnloadUnusedAssets是卸载不掉的;对于这种情况,建议直接通过Profiler Memory中的Take Sample来对其进行检测,通过直接查看WebStream或SerializedFile中的AssetBundle名称,即可判断是否存在“泄露”情况;通过Android PSS/iOS Instrument反馈的App线程内存来查看;
堆内存过大:避免一次性堆内存的过大分配,Mono的堆内存一旦分配,就不会返还给系统,这意味着Mono的堆内存是只升不降的。常见:高频调用new;log输出;
CPU占用高:NGui的重建网格导致UIPanel.LateUpdate(按照静止、移动、高频移动来切分);NGUI锚点自身的更新逻辑也会消耗不少CPU开销。即使是在控件静止不动的情况下,控件的锚点也会每帧更新(见UIWidget.OnUpdate函数),而且它的更新是递归式的,使CPU占用率更高。因此我们修改了NGUI的内部代码,使锚点只在必要时更新。一般只在控件初始化和屏幕大小发生变化时更新即可。不过这个优化的代价是控件的顶点位置发生变化的时候(比如控件在运动,或控件大小改变等),上层逻辑需要自己负责更新锚点。 加载用协程; 控制同一个UIPanel中动态UI元素的数量,数量越多,所创建的Mesh越大,从而使得重构的开销显著增加。比如,战斗过程中的HUD血条可能会大量出现,此时,建议研发团队将运动血条分离成不同的UIPanel,每组UIPanel下5~10个动态UI为宜。这种做法,其本质是从概率上尽可能降低单帧中UIPanel的重建开销。
资源冗余:AssetBundle打包打到多份中;动态修改资源导致的Instance拷贝多份(比如动态修改材质,Renderer.meterial,Animation.AddClip)。
磁盘空间换内存:对于占用WebStream较大的AssetBundle文件(如UI Atlas相关的AssetBundle文件等),建议使用LoadFromCacheOrDownLoad或CreateFromFile来进行替换,即将解压后的AssetBundle数据存储于本地Cache中进行使用。这种做法非常适合于内存特别吃紧的项目,即通过本地的磁盘空间来换取内存空间
4.美术
建立资源审查规范和审查工具:PBR材质贴图制作规范、场景制作资源控制规范、角色制作规范、特效制作规范;利用
AssetPostprocessor
建立审查工具。
压缩纹理、优化精灵填充率、压缩动画、压缩声音、压缩UI(九宫格优于拉伸);严格控制模型面数、纹理数、角色骨骼数。
粒子:录制动画代替粒子、减少粒子数量、粒子不要碰撞
角色:启用Optimize Game Objects减少节点,使用(SimpleLOD、Cruncher)优化面数。
模型:导入检查Read/Write only、Optimize Mesh、法线切线、color、禁用Mipmap
压缩纹理问题:压缩可能导致色阶不足;无透明通道用ETC1,现在安卓不支持ETC2已不足5%,建议放弃分离通道办法。
UI:尽可能将动态UI元素和静态UI元素分离到不同的UIPanel中(UI的重建以UIPanel为单位),从而尽可能将因为变动的UI元素引起的重构控制在较小的范围内; 尽可能让动态UI元素按照同步性进行划分,即运动频率不同的UI元素尽可能分离放在不同的UIPanel中; 尽可能让动态UI元素按照同步性进行划分,即运动频率不同的UI元素尽可能分离放在不同的UIPanel中;
ugui:可以充分利用canvas来切分不同元素。
大贴图会导致卡顿,可以切分为多个加载。
iOS使用mp3压缩、Android使用Vorbis压缩
5.批次
开启static batch
开启dynamic batch:要求模型小于900顶点,用法线小于300,用切线小于180,缩放不一致、使用lightmap、多通道材质等会使dynamic batch无效。
减少GameObject,场景模型数量对fps影响巨大。
批次不是越少越好,过大的渲染数据会给总线传输带来压力。
6.物理
不需要移动的物体设为Static
不要用Mesh碰撞,角色不用碰撞体
触发器逻辑优化
寻路频率、AI逻辑频率 、Fixed Timestep、降帧到30
出现卡顿的复杂计算,例如寻路、大量资源加载 可以用分帧或者协成异步来处理
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Cpp五条/article/detail/125729
推荐阅读
article
【
Unity
】
AssetBundle
(
UniTask
)加载_
assetbundle
async
un...
【代码】【
Unity
】
AssetBundle
(
UniTask
)加载。_
assetbundle
async
unitask
...
赞
踩
article
Unity
3D
游戏
开发
+
脚本
编程
完整
指南:制作
第一个
游戏
:
3D
滚球跑酷...
制小球左右移动,因此只需要获取横向的输入即可,纵向移动。更为简单直接,即将摄像机设置为小球的子物体,此时摄像机。在没有其...
赞
踩
article
Unity
3D
脚本
编程
与
游戏
开发(
1.2
)_
unity
3d
脚本
编程
与
游戏
开发
配套工程
...
有⼀个⼩技巧可以提⾼这⼀步的效率,即单击场景视窗右上⾓的坐标轴图标,让场景摄像机迅速切换为对应轴⽅向的视⾓,⽽单击下⾯的...
赞
踩
article
Unity
减低
GC
和优化...
在
Unity
中,垃圾收集(Garbage Collection,
GC
)是一项重要的内存管理机制,但过度的
GC
活动可能会...
赞
踩
article
Unity
3D
脚本
编程
与
游戏
开发(
1.7
)_
unity3d
脚本
编程
与
游戏
开发
12
章...
协程的原理有点复杂,本节仅解释它的⼤致⽤法,让读者通过简单的例⼦先将协程技术运⽤起来,在后⽂会进⼀步详细讲解协程的概念。...
赞
踩
article
Unity
3D
设计
小球
酷跑
游戏
_
unity3d
跑酷
游戏
报告
csdn
...
Unity
3D
设计
小球
酷跑详细步骤_
unity3d
跑酷
游戏
报告
csdn
unity3d
跑酷
游戏
报告
csdn
...
赞
踩
article
Unity
3D
脚本
编程
与
游戏
开发(
1.1
)_
unity
引擎
编程
...
帧率低,⼩球移动就慢。创建
脚本
组件的注意事项
Unity
规定,能够挂载到物体上的
脚本
⽂件必须是“
脚本
组件”(另有⼀种不是组...
赞
踩
article
Unity
3D
游戏
开发+
脚本
编程
完整指南:
Unity
脚本
概览-控制
物体
的运动...
的细节,只介绍简单的修改
物体
位置、处理用户输入和检测碰。辑器中是隐藏的),并立即让用户为其指定一个名称,默认为。的频率有...
赞
踩
article
Unity
3D
脚本
编程
与
游戏
开发
(1.8)...
做好两种⼦弹以后,注意要给玩家⾓⾊⾝上的Weapon组件和敌⼈⾓⾊⾝上的Weapon组件分别设置新的⼦弹预制体,这样就可...
赞
踩
article
Unity
3D
Input
System
的使用...
介绍了如何在
Unity
实现一个FPS第一人称视角的移动
Unity
3D
Input
System
的使用 ...
赞
踩
article
Unity
3D
脚本
编程与
游戏
开发
(
2.8
)
_
unity3d
脚本
编程与
游戏
开发...
仔细观察按钮在Inspector窗⼝中的详细信息,会发现它不仅具有Button组件,还具有Image组件,另外它还包含⼀...
赞
踩
article
Unity
3D
脚本
编程与
游戏
开发
(
1.6
)...
这⾥最关⼼的是所有事件的种类,以及它们的触发时机,因为
脚本
逻辑只有写在合适的事件⾥,且在合适的时机执⾏,才能恰到好处地实...
赞
踩
article
Unity
3D
脚本
编程与
游戏
开发(
2.0
)...
动⼒学刚体碰撞体通常⽤在需要改变位置或状态的碰撞体上,如⼀个可以滑动的门,⼤部分时间门就与静⽌的障碍物⼀样,但是在必要的...
赞
踩
article
Unity
3D
脚本
编程与
游戏
开发
(
1.3
)...
除此以外,物体的所有重要或不重要的性质,包括外形、颜⾊、⽗⼦关系、重量、碰撞体、
脚本
功能等,甚⾄包括物体的位置本⾝,都需...
赞
踩
article
Unity
3D
脚本编程与
游戏
开发
(
2.3
)...
阅读Move()⽅法内的跳跃相关部分,会发现跳跃的实现⽅式是对刚体添加⼒,⽽⾓⾊在下落时其向下的动量会与跳跃的⼒相抵消,...
赞
踩
article
Unity
3D脚本编程与
游戏
开发
(
2.1
)
...
射线检测其实有着丰富的碰撞信息,如可以获取到碰撞点坐标、被碰撞物体的所有信息,甚⾄可以获取到碰撞点的法线
(
碰撞点所在物体...
赞
踩
article
Unity
之
安卓
平台上架
隐私
问题
解决方案
...
分别对
Unity
是否导出
安卓
工程打包apk进行前置处理,添加
隐私
政策的展示和授权后在启动
Unity
,这样就可以解决Uni...
赞
踩
article
自定义
Unity
的
Property
Attribute
_
unity
'materialprop...
1 首先定义特性 描述类,继承自
Unity
Engine.
Property
Attribute
2 再定义特性的 绘制类,继...
赞
踩
article
Unity
编辑器
篇|(三)
Attribute
特性
(全面总结 | 建议收藏)_sharedbetw...
Unity
特性
是一种用于装饰(标记)类、字段、方法和属性的 .NET
特性
,用于控制
Unity
引擎的行为、检查代码...
赞
踩
article
Unity
Attribute
标签用法_[
colorusageattribute
(
false
,
tr...
Unity
Attribute
标签用法标记字段[ColorUsage(
false
,
true
,
0f
,
8f
,
1f
,
...
赞
踩
相关标签
unity
游戏引擎
游戏
3d
Unity 3D脚本编程
游戏开发
触发器事件
c#
Unity协程⼊门
Unity3D射击游戏
Unity游戏总体设计
Unity触发器事件
关卡设计
游戏策划
控制物体的运动
unity脚本