首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之比较大的图片的压缩(二十四)
2017
03-24

UGUI研究院之比较大的图片的压缩(二十四)

好久没写文章了,最近太累了。。

使用UGUI开发界面,一般比较小的图片会设置一个tag,让它打进图集。其实还有很多大的图片,比如logo、头像、图标、关卡图、等 。 宽高各一方大于256 或者 512的图片。

这类大的图片不太适合放在图集中,因为他们会把图集撑的很大,可是如果从图集中拿出来,又没办法压缩。因为美术不可能刚好给我们出一个2的幂次方的图片。

UGUI中有两个方法可以让不是幂次方的图片变成2的幂次方

1.给每个大图片设置一个独一无二的tag,这样这张图片就会被当成一个图集来处理。 具体压缩的方法可以看我之前写的文章

http://www.xuanyusong.com/archives/4279

2.不使用Image组件,改用RawImage

如下图所示,TextureType这里设置成Default ,Advanced里设置NonPower of 2 里面有4个选项,none、toNearest、toLarge、toSmall (设置比例的)推荐设置成toNearest。

注意:RawImage也可以设置Sprite或者Texture两种。如果觉得图片不清楚的话推荐使用方法1来压缩。

UGUI研究院之比较大的图片的压缩(二十四) - 雨松MOMO程序研究院 - 1

然后这张图片就变成了2的幂次方,它不能放在Image组件中,但是可以放在RawImage中。开始压缩图片吧,Android压缩成ETC IOS压缩成 PVRTC

这类大图片有几个特点

1、不需要合并批次(原因就是不想把图集撑的很大)

2、不需要九宫格

3、对比了一下Sprite和Texture的方式,发现Texture的加载速度要比Sprite快很多。

4、如果用RawImage就不能使用unity自带的Android ETC1 自动通道分离,如果你的游戏必须要支持ETC1的话,那么就给它设置一个tag变成图集即可

5.如果ETC2压缩方式放在了ETC1的手机上,Unity会自己转成RGBA32不用担心显示错误的问题。

6.美术就喜欢设计颜色渐变的图片,怎么压缩都无法消除抖动问题,效果都不好,所以还是要保留一些图片的压缩格式是RGBA32. 选择性压缩 ETC 和PVRTC

最后欢迎大家一起讨论。

7.最近发现RawImage不会用Sprite的Atlas 。 换句话来说,就算设置了Sprite的tag.放在RawImage上 无效。。。坑啊 

UI还是老老实实用Image吧。。。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

UGUI研究院之比较大的图片的压缩(二十四)》有 3 条评论

  1. nebula 说:

    最近遇到一个问题,即项目的大图,在ios上下无法压缩成pvrtc,非2的幂次方。ui大图肯定会有这样的问题。看到这篇帖子。这种方法仅限于一些背景图,
    假设需要使用setNativeSize就不可以。因为设置 non power of 2为toNearest后,图的宽高就为拉伸为2的幂次方后的宽高。想到的解决方法,好像只能记录
    图片的实际宽高,来重设宽高。这样的好处,只是满足了pvrtc的压缩。从而减少图片载入内存的大小,优化内存。最后提一句,图集图片设置为gui,则ios下自动
    压缩为pvrtc4bit,但是品质会下降,会模糊。解决办法,为了和android统一,基本上是将图集shader重新,图片分离为rgb和a两张来做。

  2. 你猜 说:

    2的冥次方是为了ios开发吧。这样的话最快的方法就是不开发ios版本。

  3. 牛肉干 说:

    先把图片弄成Default, toNearest 然后转成sprite可以吗
    public class spriteCreate : MonoBehaviour
    {
    public Texture2D tex;
    private Sprite mySprite;
    private SpriteRenderer sr;

    void Awake()
    {
    sr = gameObject.AddComponent() as SpriteRenderer;
    sr.color = new Color(0.9f, 0.9f, 0.9f, 1.0f);

    transform.position = new Vector3(1.5f, 1.5f, 0.0f);
    }

    void Start()
    {
    mySprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f);
    }

    void OnGUI()
    {
    if (GUI.Button(new Rect(10, 10, 100, 30), “Add sprite”))
    {
    sr.sprite = mySprite;
    }
    }
    }

留下一个回复

你的email不会被公开。