본문 바로가기

Unity

이미지 캐싱 (캐싱파일만들기)

서버에 있는 이미지는 그때그때 다운받아 쓰면 당연히도 로딩시간이 발생된다.

Assetbundle의 경우 캐시로 저장할 수 있지만 그 밖의 에셋들은 그러한 방식이 불가하다.

물론 모든 리소스들을 Assetbundle화 해도 되지만, 디바이스에 해당 Data를 저장하고, 불러와서 사용하도록 할 수 있다.

 

이때 쓸 수 있는 방식이 이미지캐싱이라는 방식이며, 몇가지 고려사항이 있다.

 

1. 다음을 Using해줘야 한다.

더보기
using System.IO; 
using System;

2. 이미 파일이 저장되어 있는지 확인을 해야 한다.

  1) 파일저장은 해당 경로가 있는지 여부로 확인한다.

더보기

File.Exists함수로 파일의 존재 여부를 알 수 있다.

File.Exists("경로/파일명.확장자")

반환은 True, Flase이다.

     

2. 없으면 다운로드 있으면, 해당 경로에서 가져와야 한다.

 1) 있을 경우 해당 경로를 통한 파일을 활용한다.

더보기
if (File.Exists(checkDirectory + "/1.png"))     //리소스 이미지 파일을 1.png을 찾는다. (이거는 임의로 지정한 파일명이다. 경로는 WWW주소와 동일하게 사용했다.)
  {
    Texture2D t = new Texture2D(ImageContents[i].Object.width, ImageContents[i].Object.height);  // 불러오는 이미지를 넣어줄 메모리를 확보한다.
    t.hideFlags = HideFlags.HideAndDontSave;  // 속성을 미리 지정한다.
    t.filterMode = FilterMode.Point;            // 속성 지정
    t.LoadImage(File.ReadAllBytes(checkDirectory + "/1.png")); // 캐시에 저장된 이미지를 Byte로 로드한다.)
    ImageContents[i].Object.mainTexture = t;        // 지정된 텍스쳐에 적용한다.
  }

 2) 없을 경우 다운로드하는 파일을 지정된 경로에 지정된 파일명으로 저장한다. (그래야 확인이 가능하며, 주로 WWW주소를 그대로 사용한다. (변환이 귀찮아서...))

더보기
WWW www = new WWW(convertURL(ImageContents[i].DrobBoxURL));

while (!www.isDone) //다운로드 프로그래스
  {
    Prograssbar.fillAmount = (1.0f / ImageContents.Length * i) + (www.progress / ImageContents.Length);
    PrograssText.text = (Prograssbar.fillAmount * 100).ToString("F2") + "%";
    yield return null;
  }
  
ImageContents[i].Object.mainTexture = www.texture;

byte[] bytes = www.texture.EncodeToPNG();
DirectoryInfo di = new DirectoryInfo(checkDirectory);
di.Create();
File.WriteAllBytes(checkDirectory + "/1.png", bytes);       // 파일이 저장될 경로를 다운로드 URL로 한뒤 1.png파일로 저장한다.