手游性能优化之深入理解Texture Compression
http://gad.qq.com/article/detail/7154875
一、引子
手游项目开发日常里,经常有美术同学搞不清Photoshop制图软件与Unity3D游戏引擎之间的图片assets流转逻辑,在工作输出时经常出现如下疑问:
1、要JPG的,还是要PNG的?
2、JPG的要压存为多高质量的?
3、PNG的还要压?引擎不是自动处理的么?
4、为毛非要正方形的?我这个图实在是没法儿做方的怎么弄?
5、图太大,要选哪个压缩方式?有的怎么选了也没效果?有的又压的太糊!
6、这个效果不行,开发没有还原好啊!
所以开发或者技美同学要经常解释这些问题,这里面的确有些内容比较难以说明白,一个是厂商比较多流派,另一个是有些知识点(技术历史)需要厘清,本文的作用就在于此,但不会很全面。
下文中出现Texture的地方均指代在Unity3D场景下。
二、不要混淆JPG/PNG等图片压缩格式与Texture Compression
JPG/PNG是变长编码格式variable bit length,它有个特点:如下图所示,颜色变化少频率低的部分,编码后占的内存字节数就少。
所以,编码后长度变来变去带来的坏处就是:无法准确的计算出原图一个坐标处的color对应的压缩到了哪里?除非你把整张图片都解压完毕,如下图所示。
这一致命弱点直接导致了GPU 里的Texture Sample算法机制不可用,所以Unity3D引擎里也不会直接使用JPG/PNG这种编码格式来打包图片assets资源。
结论:JPG/PNG是用来在游戏制作流程中间传递美术内容的,最终在游戏引擎里需要转变成一种固定码率的、可寻址的流式压缩格式,以方便随机寻址和采样。
三、PVRTC/ETC等Texture Compression格式,直接被GPU读取到显存,用时无需解压
是的,无需解压!美术同学可能难以理解,JPG压缩了之后不解压你怎么看?对,GPU就是这么屌!下面举个例子:
假设一张4M的RGB三通道JPG图片,经过ETC1压缩后变为1M,GPU 里的Fragment渲染模块根据当前的Render
State决定去加载Texture Buffer里对应的某一块字节数据,然后经过实时的运算来还原出相应的颜色值,即采样过程,这中间便省去了将整个图片解压还原出来的步骤,因为GPU芯片很擅长这种固定的算法。
好处显而易见:1.
支持随机采样,不用把整张图load进内存; 2. 即使整个load进内存,也不用解压展开成4M;3.如果你嫌1M还是太大,还能在打包游戏时用ZIP再压缩一把;
四、PVRTC 2bpp/4bpp, ETC1, ETC2, DXT, ASTC 这些都是什么鬼?
是的,手机市场就是这么乱。GPU芯片提供商有Imagination, ARM, NVIDIA, QualComm,各有各的芯片系统(SoC) IP,我们搞软件开发的要细究起来恐怕会吐血身亡,毕竟是不同的行业。不管那么多,结论有:
1、Imagination是被Intel和Apple两大头持股的,iOS平台得优选他家的PVRTC压缩格式;
2、ETC1基本上是Android采用的公案,所以选它没错,但仅支持RGB三通道,如果还有A通道,得另行单独压一张图;
3、ETC2虽然升级了,但目前的主流OpenGL ES 2.0规格尚不支持,不要多想了;
五、浅析ETC1 --- 一个像素2个bits是怎么做到的?
ETC stands for Ericsson
Texture Compression and is an open standard supported in OpenGL and OpenGL ES. The technique allows lossy compression of images at a ratio of 4:1 (depending on input format and compression method).
ETC1 textures are supported in Android and benefit from GPU hardware decompression.
没错,它居然是Ericsson公司发明的压缩专利,好在是完全公开的,并被OpenGL ES规范所支持。它基于这样一个事实:人类的视觉系统对明度luminance的敏感度高于色度chrominance。运用这一逆天的道理就能得到逆天的压缩方式,如下图:
1、先对图片进行分块4*4;
2、每块取出2个base colors(上下各一个,或者左右各一个),形成左图;
3、每块取出明度数据(逐像素的,那就是4*4=16个);
4、算法合成得到右边的压缩后的效果;
所以,ETC1要做的就是把上面2和3中产生的base colors数据和luminance数据给整起来,一起压缩咯!这真是蛋疼,用2个基色块就能代表16个像素的颜色,你当玩家眼瞎啊!?
原理不多说了,直接上图:
1、4*4的像素块分为左右或者上下两个部分,提取2个base colors,采用差分存储,一个存为R5G5B5,差值存为dR3dG3dB3;
2、如果2个base colors相差太大,导致差值溢出,则直接存2个R4G4B4,比如左边红右边绿的这种极端情况;
3、两个标记位,绿色的那位表示是555差分存储呢,还是444独立存储;
4、重点是这个table bits,代表这里两个base color对应的是明度表里的index,正好3个bits,表里也一共2^3=8项;
5、位置刚好够用:16个RGB像素,编码进4个bytes,平均下来每个像素只需2个bits;
Texture被GPU加载到显存缓冲区之后,怎么寻址,怎么采样,具体细节就不深究了,那是硬件工程师的事情。总之,在这种框架下,ETC的缺点就是:
a、不支持RGBA 4通道的图片压缩;
b、对颜色连续过渡变化的图片压缩后可能有点儿糊(所以美术同学自带的像素眼会说你把他的图搞糊了);
好了,上面就是对项目中常见的材质压缩问题的终极总结,有了这些知识点,回答前头的日常问题应该心中有数了(结合项目具体情况取舍)。
参考资料:
http://fileadmin.cs.lth.se/cs/Education/EDAN35/lectures/L8-texcomp.pdf
http://www.powervr.com/Downloads/Factsheets/PVRTextureCompression.pdf
手游性能优化之深入理解Texture Compression的更多相关文章
- 如何快速优化手游性能问题?从UGUI优化说起
WeTest 导读 本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法. 在之前的文 ...
- 斗牛app上架应用宝、牛牛手机游戏推广、百人牛牛app应用开发、棋牌游戏上传、手游APP优化
联系QQ:305-710439斗牛app上架应用宝.牛牛手机游戏推广.百人牛牛app应用开发.棋牌游戏上传.手游APP优化 iOS开发iPhone/iPad平台安卓手机软件开发机型覆盖范围 超过113 ...
- 七个要素帮你打造现象级手游!优化程度堪比《QQ飞车》
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由WeTest质量开放平台团队发表于云+社区专栏 作者:申江涛,腾讯互娱客户端工程师 商业转载请联系腾讯WeTest获得授权,非商业转载 ...
- 以C语言为例的程序性能优化 --《深入理解计算机系统》第五章读书笔记
其实大多数的编译器本身就能提供一些简单的优化,比如gcc就能通过使用 -O2 或者 -O3 的选项来优化程序.但编译器的优化始终也是有限,因为它必须小心翼翼保证优化过程不对程序的功能有改动.故而程序员 ...
- Web性能优化之-深入理解TCP Socket
什么是Socket? 大家都用电脑上网,当我们访问运维社区https://www.unixhot.com的时候,我们的电脑和运维社区的服务器就会创建一条Socket,我们称之为网络套接字.那么既 ...
- Unity性能优化的N种武器
贴图: l 控制贴图大小,尽量不要超过 1024 x1024: l 尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图: l 尽量使用压缩格式减小贴图大小: l 若干种贴图合并 ...
- 发个招聘贴,魔都求手游C++后端,UNITY前端,开发实习生
上海游旺网络科技有限公司成立于2015年5月,是一家极具潜力的新创移动游戏公司.公司初创团队均来自腾讯,盛大,畅游,墨麟,蜗牛等知名互联网公司,公司创始人团队参与制作过<鬼吹灯><Q ...
- UWA发布 | 2017 Unity手游体检蓝皮书 — ARPG篇
报告目录: 一.ARPG手游总体性能开销分析 二.ARPG手游CPU模块性能开销分析 三.ARPG手游内存模块性能开销分析 四.ARPG手游资源管理分析 五.UWA对于ARPG手游研发团队的建议 一. ...
- 手游热更新方案--Unity3D下的CsToLua技术
WeTest 导读 CsToLua工具将客户端 C#源码自动转换为Lua,实现热更新,本文以麻将项目为例介绍客户端技术细节. 麻将项目架构 其中ChinaMahjong-CSLua为C#工程,实现麻将 ...
随机推荐
- sap保存时小写字母自己主动转大写字母的解决方法
在实际应用中.ABAP保存数据到后台数据库表中时.会自己主动把前台输入的小写字母自己主动转换为大写字母来保存.有时候客户可能不须要转换,就须要用到以下的方法: 1.找到相应字段的Data ...
- EasyPusher RTSP直播之RTP数据包格式解析
-本篇由团队成员Fantasy供稿! RTP包头格式 码流总体结构 h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL).H.264 的编码视频序列包括一系列的NAL 单元,每个NAL ...
- asp.net 列表控件
web空间类都被放置在System.Web.UI.WebControls命名空间下1.ListBox ListBox控件用于创建多选的下拉列表,而可选项是通过ListItem元素来定义的.示例代码如 ...
- Detours3.0 文档翻译
http://blog.csdn.net/buck84/article/details/8289991 拦截二进制函数 Detours库能够在执行过程中动态拦截函数调用.detours将目标函数前几个 ...
- 谈谈EJB是怎样公布Web Service的
定义 我们常常会听到.xx项目中用到了Web Service.那么.什么是Web Service呢? 首先让我们来了解一下Web Service.Web Service技术.就是能使得执行在不同机器上 ...
- android中样式和自定义button样式
1)自定义button样式 一.采用图片方式 首先新建Android XML文件,类型选Drawable,根结点选selector,自定义一个文件名. 随后,开发环境自动在新建的文件里加了select ...
- 在dw中 <!----> 和 /**/ 的区别?
<!-- -->是HTML的注释标签,使用<和>是符合HTML标签语法规则的./* */是CSS和JS的注释标签.两种注释有各自的使用环境,并且不能相互替代.
- POJ 1611 The Suspects (并查集+数组记录子孙个数 )
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 24134 Accepted: 11787 De ...
- ffmpeg xcode 中的使用
最近比较闲,苦于ios设备上没有直接播放torrent 文件的软件,开始折腾了.找了不少资料有了思路.但是其中用到了ffmpeg 这个东西. ffmpeg 是通用的一个视频解决框架,用C语言编写,通用 ...
- error MSB6006: “CL.exe”已退出,代码为 -1073741502。
错误1error MSB6006: “CL.exe”已退出,代码为 -1073741502.C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Plat ...