记一次Unity3D中WWW加载本地图片很慢的BUG

2017-05-11 by Liuqingwen | Tags: Unity3D | Hits

事情是这样的,昨天有朋友在群里询问一个 Unity3D 本地图片资源加载相关的问题:“切换图片的时候,要等3,4秒才能显示切换的图片”,今天上线后看到了,然后自己也做了测试,发现并没有重现这个问题,如是两个人讨论了一番。

一、问题

需求大概是这样:从本地文件中加载图片到游戏中,然后显示到界面上。朋友的代码大概是这样的: blush

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Start () 
{
string file = "file://E:/file/path/to/image.jpg";
StartCoroutine(LoadImage(file, imageCard));
}

public IEnumerator LoadImage(string path, Image image)
{
WWW www = new WWW (path);
while (! www.isDone)
{
Debug.Log (DateTime.Now);
yield return www;
Debug.Log (DateTime.Now);
}
Texture2D texture = www.texture;
Sprite sp = Sprite.Create (texture,
new Rect (0, 0, texture.width, texture.height),
new Vector2 (0.5f, 0.5f));
image.sprite = sp;
}

运行后的控制台打印的结果显示加载本地图片的过程中花了3秒钟时间:

1
2
3
4
5/11/2017 9:49:43 PM
UnityEngine.Debug:Log(Object)
5/11/2017 9:49:46 PM
UnityEngine.Debug:Log(Object)

二、解决

显然上面的 3 秒钟时间是不符合逻辑的,即使是加载远程服务器的大图估计也花不了这么长的时间,因为没有做过 Unity3D 的开发,我的第一反应就是去官网找了 WWW 的相关用法:

You can inspect the isDone property to see if the download has completed or yield the download object to automatically wait until it is (without blocking the rest of the game).
When using file protocol on Windows and Windows Store Apps for accessing local files, you have to specify file:/// (with three slashes).

所以根据以上的建议我告诉朋友试试这两种方案:

  • 用了 isDone 就不用 yield 了,也就是删除 while(! www.isDone)
  • 改图片路径的字符串 file://file:///

很显然,结果是无用功,以上只是逻辑问题,不可能会引起长达 3 秒的加载时间。接着我自己在电脑上做了测试,莫名的发现,不管怎样,我的图片加载很顺畅!这又是什么鬼? joy

既然软件没问题,马上我怀疑上了硬件问题,朋友马上拿来固态硬盘一试!————结果是悲哀的,固态硬盘上花费了 4 秒钟的时间! joy

只能 Google 一下了,果然有同学也遇到过这个问题:www-Class for loading local texture is very slow ,高手的解释大意是:只要设置了网络的 gateway ,但是 Unity 又没有真正的连接网络,那么这个卡 3-4 秒的问题就会出现!太神奇了啊!有木有! sweat

所以,最后的解决方法肯定是拔掉网络了!哈哈,不过,我朋友并不是这样解决问题的,而是:卸载 Unity3D 并砸了电脑!?,搞错了是关闭了他安装的虚拟机!因为装了虚拟机后有两个网络适配器导致! joy

三、总结

真是奇怪啊,不过还是学到了经验,至少了解了一下 WWW 的用法。希望这个解决方法对那些刚遇到类似问题的新手有一定的借鉴作用。 grimacing

参考资料:
www-Class for loading local texture is very slow: http://answers.unity3d.com/questions/623448/www-class-for-loading-local-texture-is-very-slow.html?sort=votes
WWW Script Reference: https://docs.unity3d.com/ScriptReference/WWW.html


Comments: