|
用Unity开发游戏时一般都会把需要用到的Texture图片提前放在Assets目录下,游戏打包时自带这些Texture图片资源(适用于Android、iOS、Deskop平台等等)。然而为浏览器开发WebGL游戏时需要稍微考虑一下用户网速问题,每次打开游戏都让用户干等很长时间(假设30MB的游戏)的话会导致用户体验很差。
目前我就遇到上述的问题,游戏用gzip压缩打包后的大小为28MB,因为Unity下载完所有资源才能开始游戏,所有每次打开游戏就是看着Unity的logo等很长时间。想了想打算把一些不会在第一个Scene用到的图片不放在游戏的Assets,而分开放在服务器上让游戏需要时再远程加载使用。
远程加载图片的代码如下(这是最初版,后面有优化版):- UnityWebRequest www = UnityWebRequestTexture.GetTexture("www.xxx.com/xxx.png");
- yield return www.SendWebRequest();
- if (www.isNetworkError || www.isHttpError)
- {
- Debug.Log(www.error);
- }
- Texture2D tex = ((DownloadHandlerTexture)www.downloadHandler).texture;
- Sprite sprite = Sprite.Create(tex , new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
- image.sprite = sprite ; //image 是 UI Image
复制代码 这样加载图片后确实让打包的程序瘦身了不少,但出现了新的问题!这段代码让游戏变得巨卡让我怀疑人生。找了很多网上的大神们的优化方案,如调整图片分辨率、图片大小、异步等等,只能说这些方法只是锦上添花,但没能解决根本问题。看到一个讲Image和RawImage的区别的帖子才恍然大悟,导致程序卡顿的原因是Sprite.Create!在程序代码中动态创建sprite是个很耗资源的操作。
最后把Image换成RawImage,并直接给他赋texture值,这样就能省略Sprite.Create过程。上代码:- UnityWebRequest www = UnityWebRequestTexture.GetTexture("www.xxx.com/xxx.png");
- yield return www.SendWebRequest();
- if (www.isNetworkError || www.isHttpError)
- {
- Debug.Log(www.error);
- }
- Texture2D tex = ((DownloadHandlerTexture)www.downloadHandler).texture;
- image.texture = tex; //image 是 UI RawImage
复制代码 程序卡顿问题解决了。 |
|