东莞寮步网站建设兴远建设网站

当前位置: 首页 > news >正文

东莞寮步网站建设,兴远建设网站,app应用程序开发公司,建 网站 是软件开发目录 前言 unity性能优化之内存的优化 一、unity Analysis工具的使用。 二、内存优化方法 1、设置和压缩图片 2、图片格式 3、动画文件 4、模型 5、RenderTexture#xff08;RT#xff09; 6、分辨率 7、资源的重复利用
8、shader优化 9、对bundle进行良好的管…目录 前言 unity性能优化之内存的优化 一、unity Analysis工具的使用。 二、内存优化方法 1、设置和压缩图片 2、图片格式 3、动画文件 4、模型 5、RenderTextureRT 6、分辨率 7、资源的重复利用  8、shader优化 9、对bundle进行良好的管理 10、巧用静态合批 11、关注代码对象所占内存 ·12、音频 13、字体裁剪 总结 前言 在unity项目实际开发中总是逃不开对于项目进行优化内存、GC渲染效率GPU、drawcall、发烫耗电等问题往往是对技术的最基本的技术考验同时又有实际程序员的个体差异结果往往各不相同。 作为技术通常从技术角度考虑问题将一个好好的游戏优化成一个白模游戏会说“你看我在技术上是达标是你的资源太复杂了”作为有责任心的制作人或者美术负责人就会说“我做的东西效果好的很到游戏里怎么成这个样子了。”技术会要求美术资源问题要么重做要么大面积修改。作为有骨气的美术通常带着怨气不予理睬这样的结果可想而知项目就无法做下去。 该篇我不仅仅从技术的角度来讲解unity 项目如何优化同时也从其他方面作出阐述。因为我们最终的目的是将项目做成大家都想要的效果而不是理想的认为做出仅仅是我想要的东西。 由于篇幅原因本文仅从内存方面如何优化。 unity性能优化之内存的优化 不管硬件如何发展内存永远满足不了程序员对更大内存的渴望也无法杜绝个别不靠谱的程序员所写出来的泄露的Bug所以控制我们程序所用得内存至关重要。在此讲解方法之前需要了解unity Analysis工具的使用。 一、unity Analysis工具的使用。 不同的unity版本可能有个体差异但是基本相同我就以2021.3.2f1版本为例 找到菜单栏中window-Analysis-Profiler 点击并进入分析器 -获取内存快照 take sample 这样我们就可以看到textere2D列表下图片所占用的内存memory以及被图片被引用的次数refcount。再详细的如何使用就不再做赘述了。 二、内存优化方法 在unity项目中控制内存的方法大致有如下方法 1、设置和压缩图片 如果一张图片格式是RGBA1024*1024大小的图片是4M如果改成512*512那么就是1M可以看出图片的大小对于内存的影响是多大。 在unity项目中我们通常设定的规则是尽可能不要设置操作1024*1024大小对于通用的图片如共用的界面图集、光照贴图模型贴图等。图片大小原则是就小不就大能使用小图的尽可能使用小尺寸图片。一般来讲移动端的最大尺寸最高限定在2048*2048除个别UI图集其他的应该都要在1024*1024以下。 图片过大尺寸会造成以下问题 1加载单张图片需要的是连续大小的内存因无法找到足够大小的连续内存而造成闪退或程序异常问题 2部分机型不支持该尺寸而造成异常 在unity中我们可以根据不同平台选择图片大小 在图片inspector面板中我们看到图片在该平台下实际大小为4096*4096这远远超过我们设定的标准应该叫美术小伙伴进行修改。 我们还可以对图片尺寸做最大的限制当然最好不要这么做因为这不是常规操作。 2、图片格式 同样决定纹理所占内存大小的还有格式我们应该根据实际情况选择我们想要的格式 对于不同平台我们应该选定不同的格式 android应该尽可能选择ETC不带透明通道的或ECT2带透明通道的 IOS平台应该选择astc或pvrtc格式根据质量需要选定具体压缩比率。当然对于ASTC格式安卓和IOS都是支持的具体压缩格式就不在该文章中表述了。 pc根据实际需要选择能选择DXT格式或BC7格式。 格式相关详细信息参考各平台的推荐、默认和支持的纹理压缩格式 - Unity 手册 (unity3d.com) 在Texture Inspector面板中有一个minmap 选项 minmap勾选会让我们多出1/3左右的内存但是minmap有时也有及其的好处 减少摩尔纹和闪烁同时可以减少GPU的带宽需求。所以要根据实际情况而定。 3、动画文件 1减少动画文件浮点数的精度 动画.anim文件往往也是内存的重灾区我们用文本编辑器软件打开发现它的格式如下 内容中有大量的精度9位的数据,在一般情况损失一定的精度对动作的影响并不大实际项目中我一般选定保留三位精度。 注意降低精度有可能造成模型的个别动作不连贯需要排查。 2减少不必要的动画帧数 在不影响效果的情况需要美术配合减少动画的帧数。实际项目中我们设定帧数在30 帧。 4、模型 1减少面数 一个高精度模型有时有几万三角面可能就有几M通过美术减面的方式这是最直接但是以有时候因为减面引起美术效果不达标问题或者锯齿严重这时应该需要技术或者技术美术提高技术工艺等手段。 做过二次元的小伙伴就知道锯齿是美感的杀手。近几年比较流行的本村线的分UV的方法能在面数相对少的情况下锯齿效果改善很多。 2模型insepctor选项中read/write选项 对于模型而言Unity对于这个选项默认开启。 当项目会在运行过程中通过代码修改Mesh或者Mesh被用来作为MeshCollider组件的基础时Unity要求这个属性必须开启。如果模型没有用到MeshCollider中或者不需要通过代码修改将这个属性改成false可以节省一半的内存资源。 2模型insepctor面板中mesh Compression mesh Compression 是对unity自动对模型压缩的选项可以根据实际情况而定选择Low,medium,high等压缩质量。模型约low顶点数就少那么占用内存自然就越少。 5、RenderTextureRT 对于RT文件的使用我们可能不可避免。但是RT文件的特殊属性通常是RGBA类型所以在使用的时候我们应该坚持够用就行尽可能满足需求的同时少用。考虑缓存的方式不要频繁创建以免需要申请连续内存失败造成程序奔溃问题。 6、分辨率 根据实际情况和渲染效果设置分辨率调用 Screen.SetResolution(newWidth, height, true);接口可以按照、低-中-高等配置设置。分辨率的设置影响的不仅仅是内存同时对于渲染也有很多大的影响。 7、资源的重复利用  在场景中如MMORPG或者街道场景对3D 模型的重复利用也能减少内存。 8、shader优化 1standard shader 默认的unity standard PBR Shader由于其变体非常多当打包编译的时候Shader文件文件实体非常大大概近100M的内存空间。应该不要使用unity standdard shader或者默认的粒子shader。有时候可能发现自己并没有使用standard Shader什么通过UWA或连接手机在unity编辑器的分析列表中还是存在引用呢 这是因为如果倒入模型时没有指定shader那么系统会自动给一个默认的standard材质所以在导入模型的时候要查看材质列表是否为空如图 我们可以Editor模式下的代码钩子定义一个类继承AssetPostprocessor类来做监听模型导入时的ModelImporter设置材质信息。 9、对bundle进行良好的管理 好的bundle的管理应该不仅仅是管理Bundle本身的加载和卸载同时也要考虑资源的命中率考虑在何时真正卸载该资源或永久缓存该资源。 缓存是个好东西有的程序为了游戏流畅将很多资源预先加载到内存中请切记考虑流畅的同时也要考虑内存使用情况。 同时对于bundle的分割也很关键它的颗粒是多大怎么分就很关键了。 如我们的游戏有主城和战斗场景主城是不参与战斗的只有闲人、人物NPC、剧情表演等那么在主城就不需要加载角色的技能动作 如果是mmorpg,角色会频繁进入我们的视野我们可以把技能动作和基础的跑动等动作分开在不同的bundle中而不是打在一个bundle中。因为战斗动作可能并不需要因为在你的视野后对方一会就传送到其他地图了。 10、巧用静态合批 静态合批将场景的物件设置为static减少Drawcall 有比较好的效果相对也比较简单。实际发现静态合批的实际会生成一个个合并的模型所以在实际运用中有两份模型内存 那么我们如何选择静态合批呢 我们应该遵循这样的一个原则如果该物件重复物件比较多、不需要移动的并且比较小的物件如城市的垃圾桶模型路灯等模型我们可以选择静态。不重复的、面数多的就不需要将它设定为static 物件。 11、关注代码对象所占内存 UWA和腾讯的wetest等unity性能分析软件可以分析哪些代码对象占用内存比较多我们可以根据分析的结果做判断并一一排查。 ·12、音频 对于音频文件一个2M的文件可能在内存中解压后占用内存20M 1建议启用Force to Mono强制改成单声道 为什么建议通过勾选Force To Mono来优化音频呢 被建议的音频是双声道音频且左右两声道的音乐完全相同可以用勾选ForceToMono的方式强制将此音频修改为单声道内容不丢失的情况下可以减少它的使用内存和大小。特别是在移动平台下几乎听不出任何区别。如果左右声道内容不同开启ForceToMono会导致听到的声音错误。 2选择正确的压缩格式Compression format 一般情况下应该尽可能使用未压缩的wav文件作为音频源文件通过不同平台支持的压缩格式控制压缩比。一般移动平台下unity下大多数音频文件采用Vorbis压缩方法。如果音乐不循环可以使用MP3格式。一些操作系统对特定的压缩格式有额外的优化比如在iOS系统上可以使用MP3格式。此外一些简短常用的音效可以使用ADPCM格式。虽然这种格式的压缩比可能不是最好的但在播放过程中解码速度很快。总之音频压缩策略需要考虑不同压缩格式在不同平台下的特点以及音乐音效文件在不同用途下使用不同的压缩格式。 3) 重新 采样率( override Sample Rate) 根据实际需要选择采样的率来降低内存。 13、字体裁剪 Unity使用的都是默认的Arial动态字体这字体是微软系统自带的一个字体库它的大小可能十几MB左右在一般情况下是可以忽略它的大小但是如果是手机游戏微信小游戏这一类对安装包有极大要求的游戏就需要减少安装包的大小而字体就好比一个仓库默认情况下他会把所有的文字都包含在库里可实际上游戏开发时大部分的文字我们并没有用到但是Unity会把这些字体跟着安装包一块打包导出这无形增加了安装包的大小为此我们需要对字体进行优化也就是“裁剪”“。 字体的裁剪可以通过FontSubsetGUI,、FontCreator这两个软件具体怎么使用大家到网上搜索即可这里只抛砖引玉。 总结 降低内存的同时我们有时候会带来其它负面印象。比如选择音频的压缩格式时有可能我们带来失真效果过多的静态合批Static场景物件会造成内存过多不静态合批static场景物件有可能渲染压力比较大drawcall过多。 所以在实际运用中优化方法是固定的但是也要根据实际情况取其利弊关系。不能一概而论。由于编辑器和真机环境下有时会有截然不同的结果要借用一些测试工具UWA和wetest就非常好用具体就不作赘述。