介绍

使用 WWW 加载图片后使用 texture 属性获取图片并显示,发现在编辑器下图片正常显示,但是在 Android 真机上质量很差。

看到图片的显示质量感觉是小尺寸拉大后显示的效果,尝试 Edit | Project Settings | Quality Settings 修改 Texture Quality 可以发现在编辑器下也出现了图片质量下降。

环境

  • Unity 5.6.6f2

分析

Texture Quality 通过修改全局图片的大小来控制显示效果,但是前提是图片必须开启 MipMap 后自动生成小尺寸的图片。

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public Texture2D texture
{
  get
  {
    return this.CreateTextureFromDownloadedData(false);
  }
}

private Texture2D CreateTextureFromDownloadedData(bool markNonReadable)
{
  if (!this.WaitUntilDoneIfPossible())
    return new Texture2D(2, 2);
  if (this._uwr.isNetworkError)
    return (Texture2D) null;
  DownloadHandler downloadHandler = this._uwr.downloadHandler;
  if (downloadHandler == null)
    return (Texture2D) null;
  Texture2D tex = new Texture2D(2, 2);
  tex.LoadImage(downloadHandler.data, markNonReadable);
  return tex;
}


public Texture2D(int width, int height)
  : this(width, height, TextureFormat.RGBA32, true, false, IntPtr.Zero)
{
}

internal Texture2D(
  int width,
  int height,
  TextureFormat textureFormat,
  bool mipChain,
  bool linear,
  IntPtr nativeTex)
{
  if (!this.ValidateFormat(textureFormat))
    return;
  GraphicsFormat graphicsFormat = GraphicsFormatUtility.GetGraphicsFormat(textureFormat, !linear);
  TextureCreationFlags flags = TextureCreationFlags.None;
  if (mipChain)
    flags |= TextureCreationFlags.MipChain;
  if (GraphicsFormatUtility.IsCrunchFormat(textureFormat))
    flags |= TextureCreationFlags.Crunch;
  Texture2D.Internal_Create(this, width, height, graphicsFormat, flags, nativeTex);
}

经过查看代码可以发现,WWW 使用了 Texture2D 的默认构造方法,因此开启了纹理的 MipMap 选项。但是 UI 图片是完全不需要开启 MipMap 选项的,因此可以放心地禁用这个选项。

修复

1
2
var texture = new Texture2D(2, 2, TextureFormat.RGBA32, false);
www.LoadImageIntoTexture(texture);

这里使用 WWW 的代码加载纹理,但是将创建纹理的参数改为不创建 MipMap。

最终编辑器与真机上问题都已解决。

参考资料