載入外部圖片的三種方式
阿新 • • 發佈:2019-02-20
二、IO檔案流載入
首先,同樣的是載入檔案路徑。然後開啟另外一個執行緒將圖片的位元組流載入到字典中。
最終的載入效果圖如圖所示:同樣會導致幀率很低造成卡頓,但是這種方式有一個好處是可以先將圖片使用其他執行緒載入到快取中,造成卡頓是因為將位元組流轉成Texture2D
這裡的地形貼圖都很大,就算單張圖片壓縮到4M左右,使用LoadImage方法還是會卡頓。而這個方法又只能在主執行緒裡使用,也即不能在新開的載入執行緒裡使用。Unity對這類的類都限制了,只能在主執行緒使用。
三、Assetbundle打包再載入
首先,要將貼圖匯入到Unity工程裡面,然後對一個資料夾裡的貼圖進行打包。.0之後的打包方式比較簡單,如圖所示:
先選中要打包的貼圖,在Inspectors面板下有個AssetBundle,這裡新建你要打包成集合的名字,我以資料夾的名字新建了一個標籤“40_73.4_36.69237_77.61875”。選中資料夾裡其他圖片,將它們都設定成這個標籤。這樣就可以將整個資料夾裡的圖片打包成一個集合,方便一次性載入。
打包的程式碼和簡單,可以在Editor檔案下,建立一個編輯指令碼,程式碼如下:
對比以前的方式,新的打包方法確實簡化方便了很多。接下來將打包好的Assetbundle資料夾放到工程的同級目錄下,載入Assetbuudle的程式碼如下:
首先,同樣的是載入檔案路徑。然後開啟另外一個執行緒將圖片的位元組流載入到字典中。
/// <summary> /// 根據檔案路徑讀取圖片並轉換成byte /// </summary> /// <param name="path"></param> /// <returns></returns> public static byte[] ReadPictureByPath(string path) { FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); fileStream.Seek(0, SeekOrigin.Begin); byte[] binary = new byte[fileStream.Length]; fileStream.Read(binary, 0, (int)fileStream.Length); fileStream.Close(); fileStream.Dispose(); fileStream = null; return binary; } 然後,載入整個檔案列表裡的圖片到字典快取中。 /// <summary> /// 根據檔案路徑載入圖片 /// </summary> private void GetAllTerrainTex() { DirectoryInfo tempInfo = new DirectoryInfo(curFilePath); GetAllFile(tempInfo); foreach (string item in listStrFileName) { byte[] tempImageBuffer = ReadPictureByPath(item); if (null == tempImageBuffer) { Debug.Log("讀取路徑" + item + "圖片失敗!"); } string[] tempAllFileName = item.Split(Path.DirectorySeparatorChar); //去掉字尾 string tempStrKey = tempAllFileName[tempAllFileName.Length - 1]; tempStrKey = tempStrKey.Substring(0, tempStrKey.Length - 4).Trim(); if (null != tempStrKey && !dicImageBuffer.ContainsKey(tempStrKey)) { dicImageBuffer.Add(tempStrKey, tempImageBuffer); } else { Debug.LogError("圖片檔名為空或者有相同的檔名!"); continue; } } isLoadAllTexture = true; Debug.Log("Load All Terrain Texture!"); }
最終的載入效果圖如圖所示:同樣會導致幀率很低造成卡頓,但是這種方式有一個好處是可以先將圖片使用其他執行緒載入到快取中,造成卡頓是因為將位元組流轉成Texture2D
Texture2D tempTex = new Texture2D(TERRAIN_MAP_DI, TERRAIN_MAP_DI);
tempTex.LoadImage(item.Value);
這裡的地形貼圖都很大,就算單張圖片壓縮到4M左右,使用LoadImage方法還是會卡頓。而這個方法又只能在主執行緒裡使用,也即不能在新開的載入執行緒裡使用。Unity對這類的類都限制了,只能在主執行緒使用。
先選中要打包的貼圖,在Inspectors面板下有個AssetBundle,這裡新建你要打包成集合的名字,我以資料夾的名字新建了一個標籤“40_73.4_36.69237_77.61875”。選中資料夾裡其他圖片,將它們都設定成這個標籤。這樣就可以將整個資料夾裡的圖片打包成一個集合,方便一次性載入。
打包的程式碼和簡單,可以在Editor檔案下,建立一個編輯指令碼,程式碼如下:
[MenuItem("Example/Build Asset Bundles")] static void BuildABs() { // Put the bundles in a folder called "ABs" within the Assets folder. BuildPipeline.BuildAssetBundles("Assets/Assetbundle", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); }
對比以前的方式,新的打包方法確實簡化方便了很多。接下來將打包好的Assetbundle資料夾放到工程的同級目錄下,載入Assetbuudle的程式碼如下: