一、前言
项目上需要加载多个地图,每个地图的贴图将近
200M
,所有地图加起来贴图将近
2G
。因此,想着能不能将贴图放到工程外加载,逐研究了一下,得出了三种加载方式,分别是
WWW
加载、
C#
原生的
IO
加载在转换成
Texture2D
和
Assetbundle
打包和加载。
前面两种方式都会存在卡顿现象,因为最消耗性能的计算方式最终都还是放在主线程里。尽管第二种方式可以使用另外一个线程加载图片成
Bytes
数组,但是将字节数组转成成
Texture2D
还是在主线程里,而这个过程在图片
5M
的时候还是很卡顿,何况我的地形贴图每张有
20M
左右。对于前面两种方式没有找到任何其他好的优化方式来解决。第三种方式是我用到最理想的,在加载的过程中不会有卡顿。
二、
WWW
加载
首先,获取当前工程同目录下的“MapImages”文件夹路径,然后获取每张图片的全部路径,并将路径存到列表中。
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
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
47
48
49
50
|
/// <summary>
/// 获取当前物体应该读取的地形贴图的文件的路径
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 获取所有地图贴图文件路径
/// </summary>
/// <param name="info"></param>
private
void
GetAllFile(FileSystemInfo info)
{
if
(!info.Exists)
{
Debug.Log(
"该路径不存在!"
);
return
;
}
DirectoryInfo dir = info
|