首页 > 系统相关 >Unity性能优化内存优化

Unity性能优化内存优化

时间:2024-05-20 10:53:44浏览次数:23  
标签:占用 纹理 Unity 内存 使用 格式 优化 资源

如何优化内存? 1.压缩自带类库; 2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉; 3.释放AssetBundle占用的资源; 4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小; 5.使用光照贴图; 6.使用多层次细节(LOD); 7.使用着色器(Shader); 8.使用预设(Prefab)等。   内存开销无外乎三大部分: 1. 资源内存占用; 2. 引擎模块自身内存占用; 3. 托管堆内存占用 资源内存占用: 在一个较为复杂的大型项目中,资源的内存占用往往占据了总体内存的70%以上。因此,资源使用是否恰当直接决定了项目的内存占用情况。一般来说,一款游戏项目的资源主要可以分为以下几种:纹理(Texture),网络(Mesh),动画片段(AnimationClip)、音频片段(AudioClip)、材质(Material)、着色器(shader)、字体资源(Font)以及文本资源(TextAsset)等等。其中,纹理,网格、动画片段和音频片段则容易造成较大内存开销的资源。 纹理: 纹理资源可以说是几乎所有游戏项目中占据最大内存开销的资源。一个6万片的场景,网格资源最大才不过10MB,但一个2048*2048的纹理,可能直接就达到16MB,因此,项目中纹理资源的使用是否恰当会及大地印象项目的内存占用。 那么,纹理资源再使用时应该注意哪些地方呢? 纹理格式。纹理格式是研发团队最需要关注的纹理属性。因为它不仅影响纹理的内粗你占用,同时还决定了纹理的加载效率。一般来说,我们建议开发团队尽可能根据硬件的种类选择硬件支持的纹理格式比如Android平台的ETC、iOS平台的PVRTC、WindowsPC上的DXT等等。因此,我们在UWA测评报告中,将纹理格式进行了罗列,一边开发团队进行快速查找,一步定位。 在使用硬件支持的纹理格式时,你可能会遇到以下几个问题: 色阶问题: 由于ETC、PVRTC等格式均为有损压缩,因此,当纹理色差范围跨度较大时,均不可避免地造成不同程度的阶梯状的色阶问题。因此,很多研发团队使用RGBA32/ARGB32格式来实现更好的效果。但是,这种做法将造成很大的内存占用。比如,同样一张1024*1024的纹理,如果不开启Mipmap,并且为PVRTC格式,则其内存占用为512KB,而如果转换为RGBA32位,则很可能占用更达到4MB。所以,研发团队在使用RGBA32或ARGB32格式的纹理时,一定要慎重考虑,更为明智的选择是尽量减少纹理的色差范围,时期尽可能使用硬件支持的压缩格式进行存储。 ETC1不支持透明通道问题: 在Android平台上,对于使用OpenGLES2.0的设备,其纹理格式仅能支持ETC1格式,该格式有个较为严重的问题,即不支持Alpha透明通道,使得透明贴图无法直接通过ETC1格式来进行存储。对此。我们建议研发团队将透明贴图尽可能分成两张,即一张RGB24位纹理记录原始纹理的颜色部分和一张Alpha8纹理记录原始纹理的透明通道部分。然后,将这辆张贴图分别转化为ETC1格式的纹理,并通过特定的Shader来进行渲染,从而来达到支持透明贴图的效果。该种方法不仅可以极大程度上逼近RGBA透明贴图的渲染效果,同时还可以降低纹理的内存占用,是我们非常推荐的使用方式。 当然,目前已经有越来越多的设备支持了OpenGLES3.0这样Android平台上你可以进一步使用ETC2甚至ASTC,这些纹理格式均为支持透明通道且压缩比更为理想的纹理格式。如果你的游戏适合人群为中高端设备用户,那么不妨直接使用这两种格式来作为主要存储格式。 纹理尺寸: 一般来说,纹理尺寸越大,占用内存越大。 Mipmap功能 Mipmap旨在有效降低渲染带宽的压力,提升游戏的渲染效率。但是,开启Mipmap会有将纹理内存提升1.33倍。对于具有较大纵深感的3D游戏来说,3D场景模型和角色我们一般是建议开启Mipmap功能的,但很多2DUI纹理就不必要了。 Read&Write 一般情况下,文理资源“Read&Write”功能在Unity引擎中是默认关闭的。但是,我们仍然在项目深度优化时发现了不少项目的纹理资源会开启该选项。对此,我们建议压发团队密切关注文理资源中该选项的使用,因为开启该选项将会使文理内存增大一倍。 网格 网格资源在比较复杂的游戏中,往往占据较高的内存。 Normal\Color和Tangent(切线) 在我们深度优化过的大量项目中,Mesh资源的数据经常会含有大量的Color数据,Normal数据和Tangent数据。这些数据的存在将大幅增加Mesh资源的文件体积和内存占用。其中Color数据和Normal数据主要为3DMax、Maya等建模软件导出时设计所生成,而Tangent一般为导入引擎时生成。 更为麻烦的是,如果项目对Mesh进行DrawCallBatching操作的话,那么狠有可能进一步增加总体内存的占用。正因如此,我们在UWA测评报告中为每个Mesh展示了其Normal,Color和Tangent属性的具体使用情况,研发团队可以直接针对每种属性进行排序查看,直接定位出现冗余数据的资源。一般来说这些数据主要为Shader所用,来生成较为酷炫的效果。所以,建议研发团队针对项目中的网格资源进行详细检测,查看该模型的渲染Shader中是否需要这些数据进行渲染。 其他 动画片段 音频片段 引擎模块自身内存占用。 托管堆内存占用

标签:占用,纹理,Unity,内存,使用,格式,优化,资源
From: https://www.cnblogs.com/weigangblog/p/18201417

相关文章

  • 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{//切换到前台时执行,游戏启动时执行一次}}......
  • Unity遮挡剔除使用
    (1)设置对象为遮挡物or被遮挡物选中某个对象后,在其Occlusion窗口可以设置其Occluder Static和OccludeeStatic属性:遮挡物通过勾选一个对象的OccluderStatic可将其设置为静态遮挡物。理想的遮挡物应该是实心的,体积较大的物体。原则1:可能阻挡到其它对象的对象才应该被设置......
  • .NET 中 Channel 类(内存级消息队列)简单使用
    Channel是干什么的#TheSystem.Threading.Channelsnamespaceprovidesasetofsynchronizationdatastructuresforpassingdatabetweenproducersandconsumersasynchronously.Thelibrarytargets.NETStandardandworksonall.NETimplementations.Channelsa......
  • SQL优化-20231016
    数据结构数据库的表和索引缺一不可表特点:无序,插入速度快,查找速度慢索引(B+Tree)特点:有序,插入速度慢,查找速度快查找的效率比较,如果按照读取的数据块来计算?测试数据TABLE_OWNERTABLE_NAMEINDEX_NAMECOLUMNS......