开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2067

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2727|回复: 31

[士郎] 干货:Unity游戏开发图片纹理压缩方案

[复制链接]  [移动端链接]
排名
55379
昨日变化
26

7

主题

8

帖子

70

积分

Rank: 9Rank: 9Rank: 9

UID
250663
好友
0
蛮牛币
171
威望
0
注册时间
2017-10-25
在线时间
9 小时
最后登录
2018-1-5

专栏作家

发表于 2017-11-2 09:30:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 卫宫士郎 于 2017-11-2 09:42 编辑

对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。
在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,平台设置成RGBA16等。
嗯,非常的智能。


但是,在一些进阶的使用中,一些情况是难以满足的。


比如,我们NGUI的图集纹理,在Android平台,使用ETC1纹理+Alpha通道图的方式;iOS平台,使用PVRTC4的纹理。
个别图片纹理,要求清晰度较高的,使用RGBA16,但是使用RGBA16的渐变显示图片却惨不忍睹;


一些要求高保真的,则需要直接使用最高质量的RGBA32格式。

很多时候,随着项目的复杂需求发展,单纯的Unity纹理管理已经无法满足我们的需求了。这时候,往往需要我们做一些额外工作。
总结一下我自己的纹理压缩方案:


纹理压缩的策略
手游开发(Android/iOS)中,我会使用3个级别的压缩程度:高清晰无压缩、中清晰中压缩、低清晰高压缩;4种压缩方法:RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。一般足够应付大部分的需求了。

高清晰无压缩 - RGBA32                          


v2-8e9c5132b027445b45f4c6ed6edb9db9_720x4096.jpg

Unity RGBA32 - 高清晰无压缩.png


RGBA32等同于原图了,优点是清晰、与原图一致,缺点是内存占用十分大;对于一些美术要求最好清晰度的图片,是首选。


要注意一些png图片,在硬盘中占用几KB,怎么在Unity中显示却变大?因为Unity显示的是Texture大小,是实际运行时占用内存的大小,而png却是一种压缩显示格式;可以这样理解,png类似于zip格式,是一个压缩文件,只不过在运行时会自动解压解析罢了。


中清晰中压缩 - RGBA16 + DitheringRGBA16 + Dithering

知乎2.jpg

Unity RGBA16,不抖动处理的渐变图片惨不忍睹


既然叫RGBA16,自然就是RGBA32的阉割版。

对于一些采用渐变的图片,从RGBA32转换成RGBA16,能明显的看出颜色的层叠变化,如上图。


知乎3.jpg


采用Floyd Steinberg抖动处理后,除非放大,否则肉眼基本看不出区别

RGBA16的优点,内存占用是RGBA32的1/2;搭配上Dithering抖动,在原尺寸下看清晰度一模一样;

缺点,Unity原生不支持Dithering抖动,需要自己做工具对图片做处理;对于需要放大、拉伸的图片,Dithering抖动的支持不好,会有非常明显的颗粒感。
如何进行Dithering抖动?




Texture Packer工具中Image Format选择RGBA4444,Dithering选择FloydSteinberg

在我的项目中,TexturePacker具有非常重要的作用,像UI的图集生成,预先生成好正方形的IOS PVRTC4图集和非正方形的Android ETC1图集、 缩放原图50%等工作都由TexturePacker完成。

同样,对图像进行抖动处理,也是预先在TexturePacker使用FloydSteinberg算法进行图像抖动,再在Unity中导入使用。
TexturePacker提供命令行工具,可以做成自动化的工具。具体方法这里不详述。

RGB16

知乎4.jpg


Unity RGB16

而RGB16,是主要针对一些,不带透明通道,同时长宽又不是2的次方的图片;对于这些图片,使用RGB16可以降低一半的内存,但是效果会略逊于RGB32。
当然了,RGB16其实也是可以搭配抖动,也能提升显示效果;但同样的Dithering抖动对拉伸放大是不友好的。

低清晰高压缩 - ETC1+Alpha/PVRTC4
很多初学者都会疑惑,为什么游戏开发中经常看到一些图片,需要设置成2的次方?因为像ETC1、PVRTC4等这类在内存中无需解压、直接被GPU支持的格式,占用内存极低,而且性能效率也是最好的。

但是,相对RGBA32,还是能肉眼看出质量有所下降的。

ETC1
ETC1+Alpha一般应用在Android版的UI图集中,ETC1不带透明通道,所以需要外挂一张同样是ETC1格式的Alpha通道图。方法是,在原RGBA32的原图中,提取RGB生成第一张ETC1,再提取A通道,填充另一张ETC1的R通道;游戏运行时,Shader将两张ETC1图片进行混合。


后来,由于不想基于Unity API生成透明图,我生成Alpha通道图的方法。我使用Python的一个png.py库,用Python脚本来处理:

代码.jpg


要配合ETC1+Alpha,还需要Shader支持,这里参考直接修改NGUI的Unlit/Transparent With Colored的Shader。



参考.jpg

PVRTC4
PVRTC4在Unity中是直接支持的,不过要注意的细节是,它必须是二次方正方形;也就是说,长宽在二次方的同时,还必须要相等。

对比.jpg
几种纹理格式的对比

  • 内存占用,相对于RGBA32做比较
  • 质量星级,更多是本人感受,仅供参考


一个商业项目,混搭多种纹理格式是在所难免的事情。把项目纹理划分成高、中、低三种质量需求,是这个方案的落脚点。


在项目中,尽可能是使用ETC1和PVRTV4等GPU直接支持的图片格式,不仅内存占用低、性能也更好;当出现质量不及格时,再逐步的提升压缩格式,来满足需要。



知乎:陈小霖

评分

参与人数 1鲜花 +3 收起 理由
小枫小 + 3 很给力!

查看全部评分

本帖被以下淘专辑推荐:


回复

使用道具 举报

6蛮牛粉丝
1383/1500
排名
1007
昨日变化
3

0

主题

198

帖子

1383

积分

Rank: 6Rank: 6Rank: 6

UID
37063
好友
1
蛮牛币
4166
威望
0
注册时间
2014-7-30
在线时间
272 小时
最后登录
2018-1-22
发表于 2017-11-2 10:12:07 | 显示全部楼层
{:90:} 赞一个

回复

使用道具 举报

4四处流浪
478/500
排名
5659
昨日变化
44

5

主题

102

帖子

478

积分

Rank: 4

UID
229395
好友
1
蛮牛币
1294
威望
0
注册时间
2017-6-29
在线时间
165 小时
最后登录
2018-1-23
发表于 2017-11-2 10:25:32 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
2234/5000
排名
1310
昨日变化
3

10

主题

832

帖子

2234

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
68430
好友
4
蛮牛币
8156
威望
0
注册时间
2015-1-14
在线时间
586 小时
最后登录
2018-1-23
发表于 2017-11-2 11:01:17 | 显示全部楼层
这意思是,即使 UGUI 采用unity 自己的图集方式(非人为操作),但是仍然建议我们自己 通过 TexturePacker 工具,自己人为制作图集,这样什么压缩,不压缩,格式啥的,都可以自己控制~~~对吧?
对于减包要求,那么TexturePacker 就比unity自身 效果好·~~

LZ 文章 是这意思吗 ?

回复 支持 反对

使用道具 举报

4四处流浪
455/500
排名
8986
昨日变化
1

3

主题

252

帖子

455

积分

Rank: 4

UID
247659
好友
0
蛮牛币
1369
威望
0
注册时间
2017-10-9
在线时间
98 小时
最后登录
2018-1-3
发表于 2017-11-2 12:22:14 | 显示全部楼层
很棒棒的呦!!!

回复

使用道具 举报

排名
4556
昨日变化
3

3

主题

284

帖子

760

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
9527
好友
3
蛮牛币
409
威望
0
注册时间
2013-12-3
在线时间
214 小时
最后登录
2018-1-17
发表于 2017-11-2 12:39:33 | 显示全部楼层
谢谢楼主分享

回复

使用道具 举报

5熟悉之中
771/1000
排名
2520
昨日变化
3

0

主题

68

帖子

771

积分

Rank: 5Rank: 5

UID
97454
好友
1
蛮牛币
2749
威望
0
注册时间
2015-5-4
在线时间
227 小时
最后登录
2018-1-1
发表于 2017-11-2 13:01:03 | 显示全部楼层
三十七、“超神是指连续杀死多少人且中途未阵亡?”D 7
[发帖际遇]: ren19890419 在论坛发帖时没有注意,被小偷偷去了 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
193/300
排名
8588
昨日变化
6

0

主题

41

帖子

193

积分

Rank: 3Rank: 3Rank: 3

UID
237207
好友
0
蛮牛币
434
威望
0
注册时间
2017-8-12
在线时间
42 小时
最后登录
2018-1-2
发表于 2017-11-2 17:36:11 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1239/1500
排名
1857
昨日变化

0

主题

334

帖子

1239

积分

Rank: 6Rank: 6Rank: 6

UID
181859
好友
0
蛮牛币
2499
威望
0
注册时间
2016-11-7
在线时间
293 小时
最后登录
2018-1-21
发表于 2017-11-3 08:45:47 | 显示全部楼层
顶。。。。。。。

回复

使用道具 举报

3偶尔光临
216/300
排名
9421
昨日变化
4

1

主题

66

帖子

216

积分

Rank: 3Rank: 3Rank: 3

UID
250098
好友
0
蛮牛币
473
威望
0
注册时间
2017-10-22
在线时间
53 小时
最后登录
2018-1-23
发表于 2017-11-3 08:57:42 | 显示全部楼层
讲得很好,学习了

回复

使用道具 举报

4四处流浪
361/500
排名
6572
昨日变化
60

0

主题

46

帖子

361

积分

Rank: 4

UID
148615
好友
0
蛮牛币
511
威望
0
注册时间
2016-5-15
在线时间
153 小时
最后登录
2018-1-23
发表于 2017-11-3 10:19:57 | 显示全部楼层
好强谢谢大佬

回复

使用道具 举报

4四处流浪
456/500
排名
4518
昨日变化
3

0

主题

55

帖子

456

积分

Rank: 4

UID
159593
好友
0
蛮牛币
983
威望
0
注册时间
2016-7-30
在线时间
139 小时
最后登录
2018-1-23
发表于 2017-11-3 10:58:29 | 显示全部楼层
不错 不错 要是有demo更完美了 哈哈哈

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1110/1500
排名
2530
昨日变化
6

3

主题

150

帖子

1110

积分

Rank: 6Rank: 6Rank: 6

UID
45560
好友
1
蛮牛币
63
威望
0
注册时间
2014-9-18
在线时间
483 小时
最后登录
2018-1-23
发表于 2017-11-3 11:13:41 | 显示全部楼层
讲得很好,学习了

回复

使用道具 举报

4四处流浪
432/500
排名
4324
昨日变化
17

0

主题

55

帖子

432

积分

Rank: 4

UID
239467
好友
0
蛮牛币
1118
威望
0
注册时间
2017-8-24
在线时间
103 小时
最后登录
2018-1-23
发表于 2017-11-3 16:09:08 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
840/1000
排名
3775
昨日变化
18

1

主题

326

帖子

840

积分

Rank: 5Rank: 5

UID
122160
好友
0
蛮牛币
1453
威望
0
注册时间
2015-9-10
在线时间
196 小时
最后登录
2018-1-23
发表于 2017-11-3 17:19:38 | 显示全部楼层
感谢分享
[发帖际遇]: Vincher 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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