Unity图片优化-Dither算法(RGBA16优化)

在unity开发过程中,游戏图片占用了很大一部分的手机内存。所以在游戏开发中,对图片的优化也至关重要。

在Unity中常用的的图片格式有RGBA32,RGBA16,ETC,PVRTC等。这里我们主要讨论带透明通道的RGBA32和RGBA16这两种格式的图片在Unity占用的内存空间已经优化方案。

我们知道,RGBA32是R,G,B,A四个通道每个通道用8位来表示,RGBA16则是用4位。所以RGBA32能够带来更好的显示效果。同时也会带来更大的内存消耗。
万事总会存在利弊,这个算法在消除了色阶的同事,带来的是更多的噪点。所以这个方法不适用于图片需要放大来显示的。总体来说,该方案在一定程度上还是能够带来很好的效果。
最后把算法的核心代码贴出来 。

public class TextureImportSetting : AssetPostprocessor {

string[] assetTexturePath = new string[]{"Assets/Resources/TextureVN/"}; //放置需要优化的路径
void OnPreprocessTexture(){
foreach (var str in assetTexturePath)
{
if (this.assetPath.StartsWith(str) )
{
TextureImporter textureImporter = this.assetImporter as TextureImporter;
textureImporter.textureType = TextureImporterType.Advanced;
textureImporter.npotScale = TextureImporterNPOTScale.ToNearest;
textureImporter.mipmapEnabled = false;
textureImporter.isReadable = false;
if ( textureImporter.DoesSourceTextureHaveAlpha())
{
textureImporter.textureFormat = TextureImporterFormat.RGBA32;
}
}
}
}
public static void OnPostprocessRGB16 (Texture2D texture)
{

var texw = texture.width;
var texh = texture.height;

var pixels = texture.GetPixels ();
var offs = 0;

var k1Per15 = 1.0f / 15.0f;
var k1Per16 = 1.0f / 16.0f;
var k3Per16 = 3.0f / 16.0f;
var k5Per16 = 5.0f / 16.0f;
var k7Per16 = 7.0f / 16.0f;

for (var y = 0; y < texh; y++) {
for (var x = 0; x < texw; x++) {
float a = pixels [offs].a;
float r = pixels [offs].r;
float g = pixels [offs].g;
float b = pixels [offs].b;

var a2 = Mathf.Clamp01 (Mathf.Floor (a 16) k1Per15);
var r2 = Mathf.Clamp01 (Mathf.Floor (r 16) k1Per15);
var g2 = Mathf.Clamp01 (Mathf.Floor (g 16) k1Per15);
var b2 = Mathf.Clamp01 (Mathf.Floor (b 16) k1Per15);

var ae = a - a2;
var re = r - r2;
var ge = g - g2;
var be = b - b2;

pixels [offs].a = a2;
pixels [offs].r = r2;
pixels [offs].g = g2;
pixels [offs].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].a += ae * k7Per16;
pixels [n1].r += re * k7Per16;
pixels [n1].g += ge * k7Per16;
pixels [n1].b += be * k7Per16;
}

if (y < texh - 1) {
pixels [n3].a += ae * k5Per16;
pixels [n3].r += re * k5Per16;
pixels [n3].g += ge * k5Per16;
pixels [n3].b += be * k5Per16;

if (x > 0) {
pixels [n2].a += ae * k3Per16;
pixels [n2].r += re * k3Per16;
pixels [n2].g += ge * k3Per16;
pixels [n2].b += be * k3Per16;
}

if (x < texw - 1) {
pixels [n4].a += ae * k1Per16;
pixels [n4].r += re * k1Per16;
pixels [n4].g += ge * k1Per16;
pixels [n4].b += be * k1Per16;
}
}

offs++;
}
}

texture.SetPixels (pixels);
EditorUtility.CompressTexture (texture, TextureFormat.RGBA4444, TextureCompressionQuality.Best);
}
void OnPostprocessTexture(Texture2D texture){

foreach (var str in assetTexturePath)
{
if (this.assetPath.StartsWith(str) )
{
TextureImporter textureImporter = this.assetImporter as TextureImporter;
if ( textureImporter.DoesSourceTextureHaveAlpha())
{
OnPostprocessRGB16(texture);
}
}
}
}
}
更多unity2018的功能介绍请到paws3d爪爪学院查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值