找回密码
 立即注册
查看: 468|回复: 0

Unity内存优化之美术资源篇

[复制链接]
发表于 2021-4-9 08:26 | 显示全部楼层 |阅读模式
项目的性能优化主要在于CPU性能,GPU性能和内存。CPU及GPU性能优化见后续相关文章,此处先将最近做的关于内存优化的部分做一个简单的小结。

游戏开发中的内存开销我理解主要包括三个部分:

1、资源内存占用(美术资源为主)

2、Unity自身内存占用

3、C#托管堆内存占用

本篇主要介绍其中第一种情况也是内存开销的大头——美术资源部分。

我们通常所说的美术资源大致包括以下几种:Texuture、Mesh、AnimationClip、AudioClip、Material、Shader、Font等,其中的Texuture、Mesh、AnimationClip、AudioClip又是美术资源中最主要的内存开销。

一、Texture

这里的Texture包括模型的纹理贴图、Lightmap、NormalMap等,也包括UI贴图。Texture往往是游戏中内存开销的最大头。那么对于Texture,我们应该主要的主要是下面几点:

1、Texture格式

l众所周知Texture的格式是最直接也是影响最大的Texture属性。其直接影响了Texture的内存占用,包量及加载速度。一般来说,我们会对Texture做依据平台的格式压缩。例如:Android平台的ETC、IOS平台的PVRTC等,为了直观的看到Texture的各种格式我们需要一些辅助检查的工具,比如WeTest,在开发阶段的话则需要自己做一些一键设置的TextureImporter属性之类的工具,他看起来可能是类似这样的:

need-to-insert-img

在这个过程中我们可能会遇到几个问题:比如UI上的渐变色纹理(色阶问题),由于ETC和PVRTC都是有损压缩,所以当纹理色差范围跨度较大时,可能会出现存在阶梯状的色阶问题,即原本平滑的颜色压缩之后变成阶梯状一块一块的颜色。在这个时候,可能有的团队会采用RGBA或者ARGB等32的真彩色来解决这个问题,这样会取得很好的效果,但却会造成很大的包体和内存开销,例如,一张1024x1024的纹理,在不开启mipmap的时候,若为PVRTC格式,其内存占用512k,若换成RGBA32则占用达到4M,所以,实际上我要说的是,对于UI纹理我们应该尽量从设计层面去减少纹理的色差范围,以期可以更好的使用硬件支持的压缩格式。

l关于ETC1不支持alpha通道的问题

在Android平台上使用OpenGL ES 2.0的早期设备,由于其纹理格式只能支持ETC1格式,而ETC1格式又不支持Alpha通道,这样会导致我们无法直接保存带Alpha通道的纹理。解决方案就是将Alpha通道单独拆分出来单独保存,同时修改shader增加一个Alpha纹理的采样,以这种方法来实现对透明贴图的保存。

l关于纹理尺寸

一般来说,纹理尺寸越大,则内存占用越大。所以,尽可能降低纹理尺寸,如果512x512的纹理对于显示效果已经够用,那么就不要使用1024x1024的纹理,因为后者的内存占用是前者的四倍。

这里只说几个容易忽视的问题:

可以九宫的图片尽量九宫。

对于含有大部分透明区域同时可以拆分的贴图可以尝试拆分为多张贴图。例如下图应该被拆分为一个横向和一个纵向图片然后拼合起来,一方面可以减小内存,同时可以减少OverDraw。

need-to-insert-img

关于Mipmap

Mipmap旨在有效降低渲染带宽的压力,提升游戏的渲染效率。由于开启Mipmap会生成多张低精度纹理,会导致内存上升1.33倍。需要开启的mipmap的应该是那些摄像机视角趋于水平或者摄像机拉升的很高的游戏中的场景贴图。其他游戏若没有类似需求应当关闭mipmap,特别容易忽视的是UI贴图往往也被错误开启了mipmap,需要写一个简单的工具一键关闭。

关于Read & Write

一般来说,绝大部分的纹理都是不应该开启R&W的,除特殊需求外也应该写工具一键关闭,再针对特殊需求个别打开。

2、Mesh网格

对于Mesh的话,主要关心的是顶点色,Normal和Tangent,其中顶点色数据是在3D建模软件中导出的,并且绝大部分时候是不会使用的,建议给3D美术写模型导出插件直接不导出顶点色,个别需要用到顶点色来存储数据的情况除外。针对Normal和Tangent需要美术酌情关闭。

其余据我所知的可能是对于固定视角的游戏,如果玩家永远看到一个房子的背面,那么这些面应当被美术减掉。

其实说了这么多会发现,关于美术资源部分的内存优化,大部分的工作还是要靠美术来完成。

3、AnimationClip动画文件

对于3D模型数量庞大的游戏,其对应的动画文件也是一个很大的开销。针对动画文件的优化主要是以下几点:

l非必要的情况,不要逐帧导出动画。因为帧数直接和动画文件大小成正比。

l以尽量少的骨骼完成动画。

l合适的动画导入设置,具体合适的导入选项可以根据项目需要的动画精度决定。

need-to-insert-img

动画曲线精度压缩。

在动画导出的.fbx文件中(以ASCII保存)可以看出曲线保存的浮点数大致如下(压缩精度后):

need-to-insert-img

实际上压缩精度前这个值可能是类似99.0600001之类的数值。

当压缩完.fbx文件中的动画曲线精度之后可以使内存、包量都得到一定量的减小。

包量对比:

need-to-insert-img

need-to-insert-img

内存减小量与具体动画相关,可自行测试。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 22:48 , Processed in 0.087130 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表