Unity 性能优化:资源篇

游戏 游戏 1399 人阅读 | 0 人回复

<
Unity机能劣化

年夜的圆里来讲,经由过程Unity关于项目标机能劣化大要能够分为上面几个部门:


  • 资本
  • 衬着
  • 法式
  • 项目设置
而正在那个部门中,资本的机能劣化属于最根柢、最有用的劣化手腕,也是游戏开拓者日常开拓最需求留意的一部门,以是本篇文章便简朴的介绍一下对资本举办操纵时需求存眷哪些面
1、纹理(简朴来讲便是图片)

纹理的资本劣化次要集合于上面的几面:


  • 纹理巨细
  • 紧缩格局
  • 导进设置
凡是,正在游戏运转时,年夜部门内乱存皆是用正在了纹理上,因而您的导进设置十分枢纽,我们能够正在Inspector里板看到图片资本的疑息,相似于上面那张图:
150335lyfcj8sqmen3eyje.jpg

从机能劣化的角度看,纹理导进需求遵照以下的准绳:


  • 降低最年夜分辩率
  • 采取两次幂紧缩格局:
  • 建造纹理图散
  • 打消勾选Read/Write Enabled
  • 禁用过剩的Mip Map:Mip Map揭图正在2D粗灵战UI图形那类巨细一直不断的纹理上并没有用途
1、降低最年夜分辩率
很好了解,纹理分辩率越年夜,正在游戏运转时,占用的内乱存资本越年夜,而且占用的内乱存量是取其分辩率的仄圆成反比的。也便是道,分辩率变成本来的两倍,那末内乱存量便需求消耗四倍。因而需求从资本劣化的角度来说,需求对其举办必然的限定,简朴的来讲,一个Button的纹理凡是低于128X128,假如利用1024X024规格的巨细便形成了机能的华侈
以下里的图,我们能够正在图片资本的Inspector里板中最上面的属性中看到它:Max Size,同时能够看到能够按照差别仄台去挑选差别的最年夜分辩率:
第一张图片:Max Size调解为1024,纹理资本巨细为4.9MB
150336iz3bemffarf5vnap.jpg

第两张图片:Max Size调解为512,图片资本巨细为1.3MB
150336rc8fv8bkvsfp3tbz.jpg

2、关于纹理的紧缩
正在您自动挑选紧缩格局之前,Unity自己会对图片做一些处置,不管您放进的是PNG、JPG、PSD大概TGA,Unity城市脚动赞助我们调解为Texture 2D,那是一种简朴的调度战略:
150336mqghigoooaicq22i.jpg

那末既然Unity自己皆曾经智能转换好了,为何借要赐与开拓者挑选紧缩格局的挑选呢,间接对Texture 2D启拆好紧缩办法没有就能够了吗?
实在Unity相对其他开拓引擎有一个很明显的劣势,便是多适配性,那末为了完成这类多适配性,关于单一仄台的针对性便会相对削弱,而差别仄台的机能表示又没有尽不异,便需求开拓者去按照仄台特性去挑选针对游戏仄台的紧缩格局。
一样,即便正在统一仄台,也会按照差别的状况有着差别的紧缩需供,比如有一些枢纽的主页里图片,玩家感知强的处所,便对图片的量量请求下些,一些边角的帮助图片,能够请求便低一些,假如皆利用下量量紧缩,机能圆里便形成了华侈,但如果皆是用低量量紧缩,量量又跟没有上。以是,一样需求按照实践需供挑选差别的紧缩格局。
正在道到Unity图片紧缩时,经常会看到如许一张图,去介绍差别紧缩格局的特性取合用场景,我也是百度图片间接爬与的那张图片,各人能够参考着去看(假如有侵权,请见告我,我会立刻删除)
150336p57ih1y57qn1yyip.jpg

正在了解上里那张图之前做一个简朴的计较,一张1024乘1024的RGBA32格局图片的占用存储空间为:
因为RGBA32一个像素每个色彩值是由两个16进造的数构成,也便是8位,谁人一个像素便是8位乘以4个色彩值R、G、B、A获得的是4个字节,即4B,然后乘上1024*1024个像素,终极获得的巨细为4MB,也便是4兆。很明显那是很恐惧的一个数字,要明白现在挪动端脚机的运转内乱存大要6G,撤除体系的占用内乱存,实正给游戏用的最多也便4G`,再分派给GPU|的隐存便更少了,而若那些内乱存被用去大批减载揭图很明显是不克不及被承受的。同时,如许数据量的图片减载也会给内乱存
基于上里本死纹理带去的包体取内乱存成绩,便需求按照差别的状况采纳一些紧缩战略,因为自己根本出有好术功底,以是对取各类紧缩格局的好术显现结果没有是很理解,次要是从功用性取机能的角度去阐发各类紧缩格局的合用场景:


  • 下品格紧缩格局:RGBA32做为一种下保实的紧缩格局,能够大要极年夜的保证图片量量
  • 中品格紧缩格局:RGBA16 + Dithering一听便是RGBA32的阉割版,简朴来讲,比拟于RGBA32其颜色细分水平年夜,能够明显的看出路径感,视觉表示相对RGB32不够光滑
  • 低品格紧缩格局: ETC1+Alpha/PVRTC4那些紧缩格局常常是挪动段最经常使用的紧缩格局,其相对其他紧缩格局有着无与伦比的机能劣势
  留意:
  

  • 除因为紧缩逻辑差别带去的减载带宽削减以外,同时借需求理解像ETC1、PVRTC4等那类正在内乱存中没有需求举办解压,而是能够间接被GPU撑持,以是比拟其他紧缩格局凡是会有最好的机能表示
3、打消勾选Read/Write Enabled
该功用是为了使得游戏开拓者能够经由过程C#剧本挪用对取图片的读与取写进的掌握,很明显,那是由CPU去掌握完成的,以是为了可使得CPU获得数据,需求正在内乱存中备份一份让CPU会见。同时为了图形衬着取表示,又会将其减载到隐存中为GPU供给数据。
简朴来讲,该选项会正在游戏运转时,别离正在CPU内乱存取GPU内乱存中备份出一张揭图,假如您其实不需求关于纹理举办读写操纵,能够尝试封闭该选项,如许就能够制止游戏运转时占用过剩的内乱存
4、禁用过剩的Mip Map
Mip Map相似于模子的LOD,一样是一种基于衬着间隔改动衬着揭图粗度的手艺。其劣势是正在物体间隔衬着间隔比力近时,能够节流机能。可是利用Mip Map时会删年夜内乱存占用量。
Mip map的手艺道理是按照本初图举办2的幂次圆的递加去生成一组差别粗度的图片。当游戏运转时,会将那组图片减载到内乱存中,然后按照衬着的间隔差别,去利用差别粗度的图片。
  Mip map会删年夜多年夜的内乱存占用量呢
  

  • 正在我们利用Mip map时,假定巨细为256X256,而且会生成8张差别粗度的图片。按照2的幂次圆举办递加计较每张揭图巨细并乏减。如许终极获得的图片组的体积大要比本来的单张揭图年夜33%
经由过程一个真例去考证,假定本初图片巨细为8M,生成的第一张低粗度图片的巨细为2M(分辩率削减一半,巨细便会变成本来的四分之一,很好了解)如许大要递加8次,然后乏减,便会获得终极的图片组巨细,经由过程一个简朴的递回办法去计较一下:
  1.     public void Awake()
  2.     {
  3.         Debug.Log(GetMipmapSize(8, 8)/8);
  4.     }
  5.     // index:处置总层级数 imageSize:初初巨细 返回删年夜的内乱存量
  6.     float GetMipmapSize(int index,float imageSize)
  7.     {
  8.         float lastSize = 0;
  9.         if (index == 1)
  10.         {
  11.             lastSize = imageSize*0.25f;
  12.         }
  13.         if (index > 1)
  14.         {
  15.             lastSize = imageSize * 0.25f + GetMipmapSize(index - 1, imageSize * 0.25f);
  16.         }
  17.         return lastSize;
  18.     }
复造代码
施行法式,获得的成果为:
150337evpvb32vc3dup8xf.png

能够看到,供到的成果是靠近于33%,当然假如Mip Map对一张纹理的处置没有是八次,计较的成果会有偏向可是实践上,从三次往上,内乱存占用量的增长比例曾经十分少了,根本皆保持正在33%阁下,将上里的代码略微修正,做个小考证:
  1.         public void Awake()
  2.     {
  3.         for (int i = 3; i < 15; i++)
  4.         {
  5.             Debug.Log(string.Format("处置 {0} 次内乱存占用量为: {1}",i,GetMipmapSize(i, 8) / 8));
  6.         }        
  7.     }
  8.     float GetMipmapSize(int index,float imageSize)
  9.     {
  10.         float lastSize = 0;
  11.         if (index == 1)
  12.         {
  13.             lastSize = imageSize*0.25f;
  14.         }
  15.         if (index > 1)
  16.         {
  17.             lastSize = imageSize * 0.25f + GetMipmapSize(index - 1, imageSize * 0.25f);
  18.         }
  19.         return lastSize;
  20.     }
复造代码
获得的日记为:
150337kyrw111ww2yqqwcz.jpg

能够发明,从三层开端,根本便保持正在33%的内乱存占用量,而且正在层数逐步删年夜的时分,内乱存占用量增长量便十分十分少了。
而Unity所撑持的纹理最小为32X32,也便是最小的纹理也会分外的发生三层低粗度纹理:16X16、4X4、1X1,那便是为何很多文章介绍到利用Map mip会道其估计会增长33%的内乱存占用量
当然Mip map自己是一种机能劣化的手艺,可是正在2D粗灵大概UI元素那些没有会改动衬着粗度的纹理上,只会占用过剩的内乱存,以是正在2D粗灵大概UI元素上利用纹理时记得没有要勾选Mip map。
5、挨包图散
图散的挨包次要是劣化UI图形衬着过程当中Draw call的数目,其根本道理也是经由过程UI元素开批去削减Draw Call,进进提拔CPU的机能表示,闭于其具体细节,能够查察我之前的文章:
  图散挨包文章:
  
2、模子

比拟取纹理,模子的机能表示更多的与决于好术标准,法式来说出有更多能够劣化的处所,可是正在Unity中也有一些选项影响模子减载、衬着等圆里的机能表示,我们能够正在导进时看到:
150337kafovooynmrrxrvm.jpg

1、禁用失落Reader/Write Enables:
面击模子,能够正在Inspector里板看到那些设置选项,相似于纹理,假如正在游戏中,您没有需求对模子举办修正,能够禁用失落Reader/Write Enables去制止数据的备份而占用过剩的内乱存,我们能够正在Unity民圆文档中找到相干介绍:
150338ollsby3bil73bmlo.jpg

翻译过去便是:


  • 启用此选项后,Unity 会将 Mesh数据上传到 GPU可觅址内乱存,但也会将其保留正在 CPU 可觅址内乱存中。那意味着Unity能够正在运转时会见 Mesh数据,能够从剧本中会见它。
  • 而禁用此选项后,Unity 会将 Mesh 数据上传到 GPU可觅址内乱存,然后将其从 CPU 可觅址内乱存中删除
  • 默许状况下,此选项处于禁用形态。正在年夜大都状况下,要节流运转时内乱存利用量,请禁用此选项
而关于模子自己来讲,只管制止模子留有过剩的里数。特别是挪动端。由于下粗度模子除自己所带去的压力中,正在其他圆里也有诸多的机能搬弄
2、只管没有要勾选没有需求的功用选项
正在Unity中,某些功用即便您已利用到,也会 消耗必然的资本来保护其形态。相似上里的Reader/Write Enables选项,以是用没有到的功用我们能够考虑只管的来禁用失落
3、设置一些闭于量量取机能的选项
Unity供给了一些对模子举办劣化的选项,能够查阅Unity民圆文档去浏览理解他们,那里也扼要的列出:
150338uzqadvscqjprcud0.jpg

经由过程上里一张图片能够看出,影响模子表示取游戏机能的选项有上面几个:


  • Mesh Compression:经由过程利用网格鸿沟战每一个组件较低的位深度去紧缩网格数据,增长紧缩率会降低网格的粗度。最幸亏 Mesh 看起去取已紧缩版本出有太年夜区分的状况下将其调得尽量下。那关于劣化游戏巨细很有效
  • Optimize Mesh:肯定三角形正在网格中列出的挨次以得到更好的 GPU 机能,默许城市勾选
  • Normals:假如网格模子既没有是法线揭图也没有受及时光照影响,便选用None,如许也能够大要很好的提拔机能表示
实在,Unity设置了一些经由过程法式掌握模子量量去改动机能表示的选项,可是没有倡议利用,预期经由过程那些选项去调解机能表示,借没有如间接让好术间接处置模子。究竟结果他们愈加专业,能够更好的保证模子的表示结果取机能表示的均衡。
4、利用LOD
闭于LOD,实在该当正在衬着那一段来说,可是那个手艺又取模子网格有很年夜的干系,以是提早介绍一下
LOD即Levels of Detail,翻译过去便是多条理细节,相似取纹理衬着的Mip map手艺,一样是一种按照衬着间隔设置衬着粗度的一种手艺。实在现方法是正在游戏开拓时,好术按照差别的衬着间隔建造一组差别粗度的模子,导进到Unity经由过程LOD组件毗邻其那一组模子,并设置相干参数。如许正在游戏运转时,便会正在差别的间隔有差别的衬着粗度:
150339qjxcc2vrxiq0jvcv.jpg

那是Unity民圆文档的一个案例,能够看出,跟着衬着间隔的增长,衬着粗度逐步降落,曲到终极被剔除,如许做的劣势是保证游戏绘里表示的同时,能够最年夜水平降低衬着压力。简朴的了解,假如没有采取LOD,跟着间隔增长,物体占用的屏幕像素便会越少,那末单元像素的三角里数便会越多。单元的衬着压力便会删年夜。绘里表示需供没有下的处所衬着压力反而更下,那明显是没有公允的。以是便需求经由过程LOD去处理如许的成绩。
当然这类手艺自己也是有相称年夜的缺点的,首先便是会删年夜包体的体积,同时也会增长好术的事情量。以是正在实践开放中,普通只会对一些主要的工具利用该手艺
总结

上里所介绍的闭于资本影响游戏机能的一些经常使用的面,皆是游戏开拓者日常打仗最多的,更深化,更底层的便需求按照项目标特性举办特地的适配取调解。

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请发帖留言提供原创证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则