在Unity移动平台的游戏开发过程中,贴图资源是往往是占资源量最大的资源。如何在保证视觉效果的同时,尽可能地减少贴图资源,是开发团队会经常遇到的问题。通常来说,对于3D物体的纹理,是可以采用ETC/PVRTC等压缩比很大的算法处理,但是对于细节要求很高的UI纹理,这样处理造成的失真往往达不到质量要求。对于这类的贴图,我们可以考虑使用失真较小的16位贴图格式存储。

但是对于颜色数较高的纹理,Unity提供的默认转换方法会呈现明显的色阶。针对该问题,keijiro实现了一种Dither4444的改进算法。从下图1上可以看到,对于画面细节比较平滑的图片,该算法虽然消除了色阶现象,同时带来了肉眼可见的噪点。


<图1> 左:原始图 右:keijiro的 Dither4444示意图

笔者在keijiro的算法基础上进行了改进,提供了一个将RGB24 Bit图Dither之后转RGB565的方法,基本消除了肉眼可见的失真,实际效果见下图2。


<图2> 左:原始图 右:笔者的 Dither565示意图

实际在我的项目的应用中,对于不适合ETC/PVRTC压缩的图片,都采用了该文章中的RGB565或者RGB565+A8的方式。在肉眼基本无失真的基础上,节省了部分资源。

最后附上OnPostprocessTexture代码:

void OnPostprocessTexture (Texture2D texture)
{if(assetPath.Contains ("_dither565")){var texw = texture.width;var texh = texture.height;var pixels = texture.GetPixels ();var offs = 0;var k1Per31 = 1.0f / 31.0f;var k1Per32 = 1.0f / 32.0f;var k5Per32 = 5.0f / 32.0f;var k11Per32 = 11.0f / 32.0f;var k15Per32 = 15.0f / 32.0f;var k1Per63 = 1.0f / 63.0f;var k3Per64 = 3.0f / 64.0f;var k11Per64 = 11.0f / 64.0f;var k21Per64 = 21.0f / 64.0f;var k29Per64 = 29.0f / 64.0f;var k_r = 32; //R&B压缩到5位,所以取2的5次方var k_g = 64; //G压缩到6位,所以取2的6次方for(var y = 0; y < texh; y++){for(var x = 0; x < texw; x++){float r = pixels [offs].r;float g = pixels [offs].g;float b = pixels [offs].b;var r2 = Mathf.Clamp01 (Mathf.Floor (r * k_r) * k1Per31);var g2 = Mathf.Clamp01 (Mathf.Floor (g * k_g) * k1Per63);var b2 = Mathf.Clamp01 (Mathf.Floor (b * k_r) * k1Per31);var re = r - r2;var ge = g - g2;var be = b - b2;var n1 = offs + 1;var n2 = offs + texw - 1;var n3 = offs + texw;var n4 = offs + texw + 1;if(x < texw - 1){pixels [n1].r += re * k15Per32;pixels [n1].g += ge * k29Per64;pixels [n1].b += be * k15Per32;}if(y < texh - 1){pixels [n3].r += re * k11Per32;pixels [n3].g += ge * k21Per64;pixels [n3].b += be * k11Per32;if(x > 0){pixels [n2].r += re * k5Per32;pixels [n2].g += ge * k11Per64;pixels [n2].b += be * k5Per32;}if(x < texw - 1){pixels [n4].r += re * k1Per32;pixels [n4].g += ge * k3Per64;pixels [n4].b += be * k1Per32;}}pixels [offs].r = r2;pixels [offs].g = g2;pixels [offs].b = b2;offs++;}}texture.SetPixels (pixels);EditorUtility.CompressTexture (texture, TextureFormat.RGB565, TextureCompressionQuality.Best);}
}

Unity图片优化神器 - Dither算法进阶方案相关推荐

  1. Unity图片优化神器 - dither算法究极进化方案

    在Unity移动平台的游戏开发过程中,贴图资源是往往是占资源量最大的资源.如何在保证视觉效果的同时,尽可能的减少贴图资源,是开发团队会经常遇到的问题.通常来说,对于3D物体的纹理,是可以采用ETC/P ...

  2. Android:最全面详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

    前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情.真正的大师永远怀有一颗学徒的心. 一.概述 在Android中,性能优化是细分领域中最难且也是知识面涉及最深和最广的方向之一. 更快 ...

  3. DL之NN/CNN:NN算法进阶优化(本地数据集50000张训练集图片),六种不同优化算法实现手写数字图片识别逐步提高99.6%准确率

    DL之NN/CNN:NN算法进阶优化(本地数据集50000张训练集图片),六种不同优化算法实现手写数字图片识别逐步提高99.6%准确率 目录 设计思路 设计代码 设计思路 设计代码 import mn ...

  4. 【游戏优化】AOI算法、Unity游戏优化(一)

    Unity游戏优化.内存优化.资源优化.AOI算法.安全 AOI概念和设计 地图广播(地图消息同步) AOI解决的问题 AOI的设计 场景分析与方案设计(一) 改善方案 场景分析与方案设计(二) 场景 ...

  5. 前端的图片优化的6种方案

    前端的图片优化的6种方案 1.使用base64编码代替图片 场景:适用于图片大小小于2KB,页面上引用图片总数不多的情况 原理:将图片转换为base64编码字符串inline到页面或css中 优势:减 ...

  6. RecyclerView使用 及 滑动时加载图片优化方案

    RecyclerView使用 及 滑动时加载图片优化方案 简述 本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解 ...

  7. DL-Pytorch Task07:优化算法进阶;word2vec;词嵌入进阶

    目录 优化算法进阶 An ill-conditioned Problem Maximum Learning Rate Supp: Preconditioning Solution to ill-con ...

  8. Android RecyclerView使用 及 滑动时加载图片优化方案

    1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...

  9. Unity 性能优化(力荐)

    开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...

  10. Unity 项目优化细节

    优化思路 个人优化原则: 三原则: 注意细节.注意细节.注意细节! 优化手段: 1.善于使用工具 2.减少总量 3.空间.时间互换 4.由浅入深 1.善于使用工具: 一定要善于使用工具来分析性能问题( ...

最新文章

  1. 如何给Pycharm加上头行 # *_*coding:utf-8 *_*?
  2. 两个向量组的秩相等说明什么_解析几何初步:向量与坐标(一)
  3. Mac电脑同步工程到github
  4. 【数据库】MongoDB数据库的操作及练习
  5. Tomcat——访问错误[Invalid character found in method name. HTTP method names must be tokens]解决方案
  6. 使用HANA Web-based Development Workbench创建最简单的Server Side JavaScript
  7. windows7原版iso镜像_一定收藏,常用操作系统原版下载地址整理,Win7 Win10 Deepin...
  8. nginx限制恶意IP处理方法
  9. 解题:洛谷3402 可持久化并查集
  10. python接收邮件内容启动程序_如何使用python获取电子邮件的文本内容?
  11. 洛谷P1990 覆盖墙壁(递推)
  12. Android设备信息修改器,如何更改android手机的设备号信息
  13. 还记得星球大战里那个圆头圆脑的机器人吗
  14. TCP合法RST报文
  15. 1年2轮融资团队2倍扩张,180人的产研团队如何有序协同?
  16. Actor模型与传统模型
  17. FART脱壳机的使用与进阶(1)_FART的安装与使用(pixel为例)
  18. 【51单片机】AT24C02存储器(I²C总线)/DS18B20温度传感器(单总线)
  19. php中文本框透明度,css怎么设置透明度
  20. 下沉市场“四大天王”受关注 水滴筹成健康保障领域独角兽

热门文章

  1. 1148环形石子合并
  2. 组态王 6.55 启停plc_PLC编程进料PLC编程项目
  3. Java8:Effectively final
  4. 如何一次性下载全国谷歌卫星影像地图数据
  5. python之随机漫步数据
  6. python 绘制随机漫步图(创建RandomWalk类)
  7. python把英语句子成分字母_如何标注英语句子成分?
  8. 微信计步器怎么不计步_微信运动不计步数是怎么回事?
  9. iOS APP上线App Store流程(包括.p12导出)
  10. irving - 初学python