找回密码
 立即注册
查看: 550|回复: 0

[笔记] Unity加载远程图片

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

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-6 21:39 , Processed in 0.090144 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表