Unity游戏开发图片纹理压缩方案

本文介绍了一个针对Unity3D手游开发的纹理压缩方案,包括不同压缩格式的特点与应用场景,如RGBA32、RGBA16+Dithering、ETC1+Alpha及PVRTC4等。

http://www.jianshu.com/p/f7c3741f22af

Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式

在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,Android平台设置成RGBA16等。

嗯,非常的智能。

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

比如,我们NGUI的图集纹理,在Android平台,使用ETC1纹理+Alpha通道图的方式;iOS平台,使用PVRTC4的纹理。

个别图片纹理,要求清晰度较高的,使用RGBA16,但是使用RGBA16的渐变显示图片却惨不忍睹;

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

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

总结一下我自己的纹理压缩方案:

纹理压缩的策略

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

高清晰无压缩 - RGBA32


Unity RGBA32 - 高清晰无压缩.png

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

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

中清晰中压缩 - RGBA16 + Dithering

RGBA16 + Dithering


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

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


采用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


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图片进行混合。

生成Alpha通道图的方法可参考:
http://blog.csdn.net/u010153703/article/details/45502895

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


png.py生成alpha图

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


PVRTC4

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

几种纹理格式的对比

格式内存占用质量透明二次方大小建议使用场合
RGBA321★★★★★无需清晰度要求极高
RGBA16+Dithering1/2★★★★无需UI、头像、卡牌、不会进行拉伸放大
RGBA161/2★★★无需UI、头像、卡牌,不带渐变,颜色不丰富,需要拉伸放大
RGB16+Dithering1/2★★★★无需UI、头像、卡牌、不透明、不会进行拉伸放大
RGB161/2★★★无需UI、头像、卡牌、不透明、不渐变,不会进行拉伸放大
RGB(ETC1) + Alpha(ETC1)1/4★★★需要二次方,长宽可不一样尽可能默认使用,在质量不满足时再考虑使用上边的格式
RGB(ETC1)1/8★★★需要二次方,长宽可不一样尽可能默认使用,在质量不满足时再考虑使用上边的格式
PVRTC41/8★★需要二次方正方形,长宽一样尽可能默认使用,在质量不满足时再考虑使用上边的格式
  • 内存占用,相对于RGBA32做比较
  • 质量星级,更多是本人感受,仅供参考

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

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

内容概要:本文档聚焦于“博士论文复现”项目,重点围绕光伏并网逆变器的阻抗建模与扫频验证方法展开,利用Simulink进行系【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)统建模与仿真,涵盖锁相环和电流环控制环节,旨在分析并网系统的稳定性。文档不仅提供具体的技术实现路径,还强调科研过程中逻辑思维、创新意识与借助已有成果的重要性,提倡系统性学习与实践结合。此外,文中列举了多个相关科研方向的复现案例与资源链接,涵盖虚拟电厂调度、风光制氢、电力系统优化等多个前沿领域,形成一个综合性科研辅助资料集合。; 适合人群:具备电力电子、自动控制或新能源系统背景的研究生、博士生及科研人员,熟悉MATLAB/Simulink仿真环境,有志于从事并网逆变器稳定性分析或相关课题研究的人员。; 使用场景及目标:①复现博士论文中的光伏并网逆变器阻抗建模与扫频分析过程,掌握其理论基础与仿真技巧;②深入理解锁相环与电流环在并网系统稳定性中的作用;③获取相关科研项目的代码与数据资源,用于学术研究、论文撰写或工程验证。; 阅读建议:建议按照文档提供的目录顺序系统学习,优先下载并查看网盘中的完整资源,结合Simulink模型与代码进行实操演练,注重理论与仿真的对照分析,以加深对阻抗建模与稳定性判据的理解。
内容概要:本文介绍了基于粒子群优化算法【故障定位】基于粒子群优化算法的故障定位及故障区段研究【IEEE33节点】(Matlab代码实现)(PSO)在IEEE33节点系统上进行故障定位及故障区段判定的研究,采用Matlab代码实现。通过构建配电网故障定位的数学模型,利用粒子群算法的全局寻优能力,快速准确地识别故障发生的位置与范围。文中详细阐述了算法原理、适应度函数设计、约束条件处理及仿真流程,并结合IEEE33节点标准测试系统验证了方法的有效性和鲁棒性。此外,文档还列举了多个相关科研方向及Matlab/Simulink仿真实现案例,涵盖智能优化、机器学习、电力系统管理、路径规划等多个领域,展示了广泛的科研应用场景和技术支持能力。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、故障诊断相关工作的工程技术人员。; 使用场景及目标:① 掌握基于智能优化算法的配电网故障定位方法;② 学习如何将粒子群算法应用于实际电力系统问题建模与求解;③ 借助Matlab实现算法仿真,提升科研与工程实践能力;④ 拓展对电力系统故障诊断、优化算法应用及综合能源系统仿真的理解。; 阅读建议:建议读者结合提供的Matlab代码进行实操演练,深入理解算法实现细节与参数设置,同时可参考文档中列出的其他研究方向拓展思路,适用于科研项目开发、论文复现与算法改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值