首页 > 其他分享 >Unity优化总结(2021.04.08)

Unity优化总结(2021.04.08)

时间:2024-05-20 10:56:13浏览次数:22  
标签:2021.04 08 Unity 内存 使用 优化 减少 加载

项目性能优化的三个方面: 1.CPU优化 Cpu优化不够会出现的问题:

  • 由于短时间计算量太大,画面流畅性降低,出现跳帧
  • 发热严重,耗电量高
(1)代码方面
  • 删除一些空的方法,尤其是Update等;
  • 使用for循环代替foreach,使用List代替ArrayList,尽量少使用封箱拆箱操作;
  • 循环中可以Break掉的直接退出循环,减少不必要的循环;
  • 少使用复杂运算,如触发、开平方根、反余弦,使用+、*代替;
  • FixedUpdate等频繁调用的方法可以扩大间隔,可以使用协程、InvokeRepeating代替;
  • OnGui最好只在一个脚本中出现;
  • OnBecameVisible当物体被相机看到才执行一些操作,常用于AI
  • 不使用打印、不出现警告;
  • 不能频繁的获取组件、创建新的对象,使用全局变量代替;
(2)物理系统方面
  • 碰撞检测方面、使用离散的检测;
  • 碰撞器不使用MeshCollider,使用简单模型代替;
(3)动画和粒子系统
  • 使用简单的动画
  • 减少例子系统数量、缩小效果
(4)Shader特效和灯光方面
  • Shader尽量使用一些简单的算法,不使用复杂的效果;
  • 尽量不使用透明的处理;
  • 减少屏幕特效的复杂运算;
  • 灯光方面不使用实时阴影,使用Mixe
2.GPU优化
  • 批处理
动态批处理:要求比较高,对面数、顶点数、材质球都有要求; 静态批处理:把不动的物体标记成static,相同的材质球设置为预设物使用;
  • 减少模型数量、骨骼数、片面数,使用发现贴图来代替细节模型
  • 减少场景的大小,场景中树、草模型数量
  • 灯光烘焙使用光照探测、Mixed
  • 遮挡剔除、LOD(消耗内存)、MipMap(消耗内存)
  • 减少镜头特效、减少透明的效果、反射效果
  • 减少不必要的层级,打包图集,一个图集最好不要超过1024*1024
  • 使用序列帧动画代替粒子系统(消耗内存)
3.内存优化 内存优化的不够会出现的问题 闪退和卡死,安卓的低内存杀手Low Memory Killer会在低内存情况下杀掉内存占用过大的程序   内存有三种:
  1. 程序代码
  2. 托管堆(Managed Heap)
  3. 本机堆(Native Heap)
除了动态加载和卸载资源,比如在游戏内的时候,我们可以把游戏外的一些UI图集卸载掉;除了降低资源质量或屏幕分辨率,这是有损优化,一般作为最后的手段。还有如下优化建议:   程序代码 程序代码包括了所有的Unity引擎使用的库、以及你所写的所有的游戏代码。 在编译后,得到的运行文件将会被加载到设备中执行,并占用一定内存。这部分内存实际上是没有办法去“管理”的,它们将在内存中从一开始到最后一直存在。一个空的Unity默认场景,什么代码都不放,在iOS设备上占用内存应该在17MB左右,而加上一些自己的代码很容易就飙到20MB左右。想要减少这部分内存的使用,能做的就是减少使用的库,稍后再说。 也许,这就是,为什么不用Unity高效开发APP的原因吧?但还是可以考虑用Unity开发APP,毕竟还好吧~   托管堆 托管堆是被Mono使用的一部分内存。Mono是一个开源的.net框架的一种实现,对于Unity开发,其实充当了基本类库的角色。托管堆用来存放数组、字符串、类的实例等。“托管”的意思是Mono“应该”自动地改变堆的大小来适应你所需要的内存,并且定时地使用垃圾回收(GC)来释放已经不需要的内存。   本机堆 本机堆是Unity引擎进行申请和操作的地方,比如贴图,音效,关卡数据等。Unity使用了自己的一套内存管理机制来使这块内存具有和托管堆类似的功能。基本理念是:如果在这个关卡里需要某个资源,那么在需要时就加载,之后在没有任何引用时进行卸载。 听起来很美好也和托管堆一样,但是由于Unity有一套自动加载和卸载资源的机制,让两者变得差别很大。自动加载资源可以为开发者省不少事儿,但是同时也意味着开发者失去了手动管理所有加载资源的权力,这非常容易导致大量的内存占用(贴图什么的你懂的),也是Unity给人留下“吃内存”印象的罪魁祸首。   优化程序代码的内存占用   这部分的优化相对简单,因为能做的事情并不多:主要就是减少打包时的引用库(即 库剥离),改一改build设置即可。   当使用Unity开发时,默认的Mono包含库可以说大部分用不上,在Player Setting面板里,将最下方的Optimization栏目中“Api Compatibility Level”选为.NET 2.0 Subset,表示你只会使用到部分的.NET 2.0 Subset,不需要Unity将全部.NET的API包含进去。 接下来的“Stripping Level”表示从build的库中剥离的力度,每一个剥离选项都将从打包好的库中去掉一部分内容。你需要保证你的代码没有用到这部分被剥离的功能,选为“Use micro mscorlib”的话将使用最小的库。库剥离可以极大地降低打包后的程序的尺寸以及程序代码的内存占用。   另外还有 IO和网络 IO和网络优化不好会出现的问题:
  1. 网络延迟甚至掉线
  2. 加载资源导致的跳帧
  3. 加载时间过长
常见的优化手段:
  1. 使用独立的线程进行加载,Unity中还能利用协程
  2. 减少网络包里面的冗余数据
  3. 合并小包,减少请求数据的次数
  4. 分帧对回包进行处理
  5. 限制一定时间内的发包频率

 

标签:2021.04,08,Unity,内存,使用,优化,减少,加载
From: https://www.cnblogs.com/weigangblog/p/18201401

相关文章

  • Unity性能优化CPU优化
    CPU主要进行计算机的各种计算操作,因此关于CPU性能优化的方面和Tips有很多,有些影响大有些影响小,有些容易优化有些不易优化,细节方面也有很多,归类之后重点讲几个方面,并列出常见Tips。对CPU性能影响比较大的主要有以下几个方面:DrawCalls,物理组件,GC,代码质量,其中DrawCall是CPU优化最先......
  • Unity性能优化GPU渲染优化
    GPU优化不够容易出现1.发热严重,耗电量高2.FPS降低GPU优化的方向:1.像素的复杂度,比如实施阴影(手游中禁用),复杂的shader2.顶点过多,也就是模型面数多、复杂3.GPU的显存带宽 一、优化美术资源1)合理规划图集2)约定好模型的最大三角形面数3)制定合理的粒子效果规范4)减少模型数......
  • Unity性能优化内存优化
    如何优化内存?1.压缩自带类库;2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;3.释放AssetBundle占用的资源;4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;5.使用光照贴图;6.使用多层次细节(LOD);7.使用着色器(Shader);8.使用预设(Prefab)等。 内存开......
  • Unity内存优化(来自uwa)
    内存优化——“勿以善小而不为,勿以恶小而为之” 资源内存占用一、纹理资源纹理资源可以说是几乎所有游戏项目中占据最大内存开销的资源。一个6万面片的场景,网格资源最大才不过10MB,但一个2048x2048的纹理,可能直接就达到16MB。因此,项目中纹理资源的使用是否得当会极大地影响......
  • Unity场景预加载
    async.allowSceneActivation=false;privateAsyncOperationasync;async=SceneManager.LoadSceneAsync("MainScene");async.allowSceneActivation=false;yieldreturnStartCoroutine(Loading());IEnumeratorLoading(){floatcurProgress......
  • Unity中Reorderable List用法(待维护)
    Unity官方文档里完全没有提到ReorderableList类,这是因为它不在UnityEngine或UnityEditor的命名空间下,而是在UnityEditorInternal命名空间下,这个命名空间里的东西是没有官方文档支持的 ReorderableList的作用它的作用,是让一个数组,在Unity的Inspector界面上显示得更好一些//......
  • Invalid URI at UnityEngineInternal.WebRequestUtils.MakeInitialUrl (System.Stri
    问题背景:有一个项目用到3d模型,原来访问地址用的是域名,访问老是报跨域问题,于是换成了内网地址这么一换问题来了,控制台直接报错 FormatException:InvalidURIatUnityEngineInternal.WebRequestUtils.MakeInitialUrl(System.StringtargetUrl,System.StringlocalUrl)[0......
  • Unity是如何跨平台的
    做游戏肯定要跨平台,Unity是如何实现跨平台的,这就得提到Unity脚本后端处理(ScriptingBackend)的两种方式Mono和IL2Cpp Mono组成组件:C#编译器,CIL虚拟机,核心类别的程序库,Mono的编译器负责生成符合公共语言规范的映射代码Mono打包的主要流程:c#script,unityspcript和第三方库......
  • Unity渲染管线的流程
    来自https://www.jianshu.com/p/02eebbf9ad9a 渲染管线的流程是在GPU中进行的,它主要占有计算机的显存部分。渲染管线在这个过程中进行了顶点处理、面处理、光栅化、像素处理。 1.顶点处理3D模型是由众多点构成的面展现出来的。顶点处理:是通过一系列坐标系的变换,让每个......
  • Unity中的OnApplicationPause和OnApplicationFocus
    OnApplicationPause游戏进入后台和返回前台//游戏进入后台时执行该方法pause为true切换回前台时pause为falsevoidOnApplicationPause(boolpause){if(pause){//切换到后台时执行}else{//切换到前台时执行,游戏启动时执行一次}}......