前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UI图片纹理的压缩问题

UI图片纹理的压缩问题

作者头像
孙寅
发布2020-06-02 11:36:21
1.5K0
发布2020-06-02 11:36:21
举报
文章被收录于专栏:宜达数字宜达数字

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

纹理压缩可以通过减少内存来显著地提高OpenGL的性能,使内存使用的效率更高 问题:无法兼容多个平台的问题,在Android平台,使用ETC1纹理+Alpha通道图的方式;IOS平台,使用PVRTC4的纹理;部分要求清晰度较高的,使用RGBA16,但是使用RGBA16的渐变显示图片却惨不忍睹;一些要求高保真的,则需要直接使用RGBA32格式

RGBA32等同于原图了,优点是清晰、与原图一致,缺点是内存占用十分大;对于一些美术要求最好清晰度的图片,是首选。   要注意一些png图片,在硬盘中占用几KB,怎么在Unity中显示却变大?因为Unity显示的是Texture大小,是实际运行时占用内存的大小,而png却是一种压缩显示格式;可以这样理解,png类似于zip格式,是一个压缩文件,只不过在运行时会自动解压解析罢了。

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

image

既然叫RGBA16,自然就是RGBA32的阉割版。   对于一些采用渐变的图片,从RGBA32转换成RGBA16,能明显的看出颜色的层叠变化,如上图。

image

采用Floyd Steinberg抖动处理后,除非放大,否则肉眼基本看不出区别   RGBA16的优点,内存占用是RGBA32的1/2;搭配上Dithering抖动,在原尺寸下看清晰度一模一样;缺点,Unity原生不支持Dithering抖动,需要自己做工具对图片做处理;对于需要放大、拉伸的图片,Dithering抖动的支持不好,会有非常明显的颗粒感。

如何进行Dithering抖动?
代码语言:javascript
复制
   [生成RGBA4444]  https://github.com/keijiro/unity-dither4444/blob/master/Assets/Editor/TextureModifier.cs

http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing http://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering

image

Texture Packer工具中Image Format选择RGBA4444,Dithering选择FloydSteinberg在我的项目中,TexturePacker具有非常重要的作用,像UI的图集生成,预先生成好正方形的IOS PVRTC4图集和非正方形的Android ETC1图集、 缩放原图50%等工作都由TexturePacker完成。   同样,对图像进行抖动处理,也是预先在TexturePacker使用FloydSteinberg算法进行图像抖动,再在Unity中导入使用。   TexturePacker提供命令行工具,可以做成自动化的工具。具体方法这里不详述。 RGB16

image

而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图片进行混合。   生成Alpha通道图的方法将在NGUI UIAtlasMaker修改中讲到   要配合ETC1+Alpha,还需要Shader支持,这里提供参考直接修改NGUI的Unlit/Transparent With Colored的Shader。

image

Paste_Image.png

  • PVRTC4   PVRTC4在Unity中是直接支持的,不过要注意的细节是,它必须是二次方正方形;也就是说,长宽在二次方的同时,还必须要相等。 几种纹理格式的对比
格式 内存占用 质量 透明 二次方大小 建议使用场合
  • RGBA32 1 ★★★★★ 有 无需 清晰度要求极高
  • RGBA16+Dithering 1/2 ★★★★ 有 无需 UI、头像、卡牌、不会进行拉伸放大
  • RGBA16 1/2 ★★★ 有 无需 UI、头像、卡牌,不带渐变,颜色不丰富,需要拉伸放大
  • RGB16+Dithering 1/2 ★★★★ 无 无需 UI、头像、卡牌、不透明、不会进行拉伸放大
  • RGB16 1/2 ★★★ 无 无需 UI、头像、卡牌、不透明、不渐变,不会进行拉伸放大
  • RGB(ETC1) + Alpha(ETC1) 1/4 ★★★ 有 需要二次方,长宽可不一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
  • RGB(ETC1) 1/8 ★★★ 无 需要二次方,长宽可不一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
  • PVRTC4 1/8 ★★ 无 需要二次方正方形,长宽一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式 • 内存占用,相对于RGBA32做比较 • 质量星级,仅供参考

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

1、移动端手游开发(Android/IOS)中,一般会使用3个级别的压缩程度:高清晰无压缩、中清晰中压缩、低清晰高压缩;4种压缩方法:RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何进行Dithering抖动?
  • 格式 内存占用 质量 透明 二次方大小 建议使用场合
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档