Unity实用小工具或脚本 |
您所在的位置:网站首页 › unity加载大量外部图片 › Unity实用小工具或脚本 |
Unity实用小工具或脚本—加载外部图片的三种方式
发表于2017-12-20
评论0
2.4k浏览
想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学堂游戏程序行业精英群 711501594 一、前言 项目上需要加载多个地图,每个地图的贴图将近200M,所有地图加起来贴图将近2G。因此,想着能不能将贴图放到工程外加载,逐研究了一下,得出了三种加载方式,分别是WWW加载、C#原生的IO加载在转换成Texture2D和Assetbundle打包和加载,下面就给大家介绍下这三种加载外部图片的方式。 前面两种方式都会存在卡顿现象,因为最消耗性能的计算方式最终都还是放在主线程里。尽管第二种方式可以使用另外一个线程加载图片成Bytes数组,但是将字节数组转成成Texture2D还是在主线程里,而这个过程在图片5M的时候还是很卡顿,何况我的地形贴图每张有20M左右。对于前面两种方式没有找到任何其他好的优化方式来解决。第三种方式是我用到最理想的,在加载的过程中不会有卡顿。二、WWW加载首先,获取当前工程同目录下的“MapImages”文件夹路径,然后获取每张图片的全部路径,并将路径存到列表中。 /// /// 获取当前物体应该读取的地形贴图的文件的路径 /// /// private string GetFilePath() { string[] strTempPath = Application.dataPath.Split('/'); string strPath = string.Empty; //去掉后面两个,获取跟工程相同目录的路径,如“E:/ZXB/MyProject/Asset/",去掉后面两个就得到和工程同级的目录为:“E:/ZXB” for (int i = 0; i < strTempPath.Length-2; i++) { strPath += strTempPath[i] + "/"; } //加上整个地形贴图的文件命 strPath += TERRAINMAP_FILENAME + "/"; //最后加上当前文件夹的名称,最后的文件夹名称和当前物体的名称一致 strPath += gameObject.name + "/"; return strPath; } /// /// 获取所有地图贴图文件路径 /// /// private void GetAllFile(FileSystemInfo info) { if (!info.Exists) { Debug.Log("该路径不存在!"); return; } DirectoryInfo dir = info as DirectoryInfo; if(null==dir) { Debug.Log("该目录不存在!"); return; } FileSystemInfo[] si = dir.GetFileSystemInfos(); for (int i = 0; i < si.Length; i++) { FileInfo fi = si[i] as FileInfo; if(null!=fi&&IsImage(fi.Extension)) { listStrFileName.Add(fi.FullName); } else { } } } 然后根据路径列表使用WWW逐个加载图片 /// /// 根据文件路径加载图片 /// private IEnumerator GetAllTexture() { curFilePath = GetFilePath(); DirectoryInfo tempInfo = new DirectoryInfo(curFilePath); GetAllFile(tempInfo); foreach (string item in listStrFileName) { WWW www = new WWW("file://" + item); yield return www; //先得到最后的图片文件名 string[] tempAllFileName = item.Split(Path.DirectorySeparatorChar); //去掉后缀 string tempStrKey = tempAllFileName[tempAllFileName.Length - 1]; tempStrKey = tempStrKey.Substring(0, tempStrKey.Length - 4).Trim(); if(null!=tempStrKey&&!dicTextures.ContainsKey(tempStrKey)) { dicTextures.Add(tempStrKey, www.texture); } else { Debug.LogError("图片文件名为空或者有相同的文件名!"); continue; } if(dicSubTerrainMat.ContainsKey(tempStrKey)) { dicSubTerrainMat[tempStrKey].SetTexture("_MainTex", www.texture); } else { Debug.LogError("文件名"+tempStrKey+"在材质列表中没有找到对应的材质名!"); } } isLoadAllTexture = true; Debug.Log("Load All Terrain Texture!"); } 效果图如图所示:一开始显示的是默认模糊处理的贴图,在加载的过程中帧率非常低,造成卡顿。原文链接 著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。 如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引 标签: UnityAssetBundleJavaScript本文作者 ![]() ![]() |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |