纹理与贴图优化:从格式选择到图集管理
纹理优化,说白了就是跟显存和带宽较劲。我做了这么多年移动端优化,最深的体会就是:纹理没管好,其他优化都是白搭。为什么?因为纹理占用的内存和带宽,往往是整个游戏里最大的开销。
今天咱们就聊聊纹理优化的四个核心方向:格式选择、大小与Mipmap、图集制作、压缩设置。嗯,每个点我都踩过坑,咱们一个一个说。
纹理格式选择:ASTC vs ETC2
先问个问题:你还在用RGBA32吗?如果是,那你的游戏大概率在内存上吃了大亏。
移动端主流的压缩格式就两个:ETC2 和 ASTC。我个人的习惯是:能用ASTC就别用ETC2。为什么?
- ASTC:支持RGBA,压缩比灵活(4x4到12x12),画质损失小。iOS和主流Android都支持。
- ETC2:兼容性更好(老设备也能跑),但压缩比固定,不支持透明通道的独立控制。
我在项目中遇到过一个问题:用ETC2压缩带Alpha的贴图,结果边缘锯齿严重。后来换成ASTC 8x8,内存降了30%,画质反而更好了。
核心建议:
- 新项目:无脑选ASTC,压缩比选6x6或8x8
- 兼容老设备:备一套ETC2 fallback
- UI贴图:用RGBA32 + 手动压缩(后面讲)
小技巧:Unity的Texture Importer里可以设置多个平台的格式。我一般会在Android平台选ASTC,iOS也选ASTC,但压缩比不同——Android用8x8,iOS用6x6。因为iOS的GPU带宽通常更宽裕。
纹理大小与Mipmap:别让GPU做无用功
纹理大小不是越大越好。你想想看,一个2048x2048的贴图,在屏幕上只占100x100像素,GPU却要加载整张图——这不是浪费吗?
Mipmap就是解决这个问题的。它预先生成一系列缩小版的纹理,GPU根据物体距离自动选择合适的分辨率。
我曾经在一个项目中,忘了给地形贴图开Mipmap。结果远处的地形闪烁得跟电视雪花一样。嗯,从那以后我养成了习惯:所有3D物体的贴图,默认都开Mipmap。
注意:Mipmap会增加约33%的内存开销(因为多存了各级缩略图)。但换来的是渲染性能提升和画质改善,这笔买卖划算。
纹理大小的选择,我有个经验公式:
| 使用场景 | 推荐大小 | 说明 |
|---|---|---|
| UI图标 | 128x128 ~ 256x256 | 大了浪费,小了模糊 |
| 角色贴图 | 512x512 ~ 1024x1024 | 主角用1024,NPC用512 |
| 场景背景 | 1024x1024 ~ 2048x2048 | 远景用Mipmap自动降级 |
| UI全屏背景 | 2048x2048 | 但记得压缩格式选ASTC |
避坑指南:我曾经把一张角色贴图设成4096x4096,结果在低端机上直接闪退。后来发现,其实1024x1024在手机上根本看不出区别。记住:纹理大小要跟屏幕分辨率匹配。1080p的屏幕,你放4K贴图,纯属浪费。
图集(Atlas)制作与使用:减少Draw Call的利器
图集是什么?说白了就是把多张小图拼成一张大图。好处很明显:一次Draw Call就能渲染多个UI元素。
我见过最夸张的项目:一个界面用了200多张独立贴图,Draw Call直接飙到300+。后来全部合到图集里,Draw Call降到20。你说这优化值不值?
图集制作有几个要点:
- 尽量把同类型的贴图放一起:比如所有按钮放一个图集,所有图标放另一个
- 图集大小控制在2048x2048以内:太大了加载慢,而且有些老设备不支持
- 留边距(Padding):至少2像素,防止相邻贴图互相干扰
- 使用Unity的Sprite Atlas工具:自动打包,支持变体,比手动拼图方便多了
我的习惯:
- UI图集:按功能模块分(主界面、战斗界面、设置界面)
- 场景图集:按资源类型分(建筑、植被、道具)
- 角色图集:每个角色单独一个图集(方便换装)
注意:图集不是越大越好。一个4096x4096的图集,如果只用了10%的区域,那剩下的90%都是浪费。我建议:图集利用率低于70%就重新打包。
纹理压缩设置:Unity里的那些坑
Unity的纹理压缩设置,其实挺灵活的。但很多人要么不管,要么乱设。我来说说我的做法。
在Unity的Texture Importer里,有几个关键选项:
- Format:选ASTC或ETC2,别用RGBA32(除非是UI里的精细贴图)
- Compression Quality:选Normal或High。Low质量太差,High压缩慢但画质好
- Non Power of 2:选ToNearest或None。我建议选ToNearest,自动补成2的幂
- Read/Write Enabled:默认关掉。开了会多一份CPU可读的副本,内存翻倍
避坑指南:我曾经为了省事,把所有贴图的Compression Quality都设成Low。结果游戏里全是色块和噪点。后来改成Normal,内存只多了5%,画质却好了不止一个档次。所以:别为了省那点内存牺牲画质,玩家不是瞎子。
还有一个容易被忽略的点:纹理的Max Size。Unity默认是2048,但很多贴图根本不需要那么大。我一般会:
- UI图标:Max Size设256
- 角色贴图:Max Size设1024
- 场景贴图:Max Size设2048
这样设置后,内存占用能降20%~30%。而且玩家根本看不出区别——因为屏幕就那么大,你放再大的贴图,显示出来的像素数也是固定的。
总结一下纹理压缩的黄金法则:
- 格式选ASTC(兼容性允许的情况下)
- 压缩质量选Normal
- Max Size按实际需求设,别贪大
- 3D贴图开Mipmap,UI贴图不开
- Read/Write Enabled永远关掉
嗯,纹理优化这块,说白了就是在内存、带宽和画质之间找平衡。没有银弹,但遵循这些原则,至少能让你少踩80%的坑。下一章咱们聊聊模型与网格优化,那个坑更多,到时候再细说。