投稿者 tel | 2020年2月1日

UnityWebRequestTextureでテクスチャが解放されないパターン

UnityWebRequestTextureを使って画像をダウンロードしたときにテクスチャが解放されずリークしてしまうパターンがあった。(Unity 2018.4)

通常、UnityWebRequestTexture.GetTextureで画像をダウンロードしたあとDownloadHandlerTexture.GetContentでテクスチャを取得してUIに表示する。この場合、テクスチャを使わなくなったときにDestroyするかResources.UnloadUnusedAssetsを呼べばテクスチャは解放される。

ただし次のようにダウンロードしたあとにテクスチャにアクセスせずにUnityWebRequestを削除してしまった場合にResources.UnloadUnusedAssetsを呼び出してもダウンロードしたテクスチャが解放されなくなってしまう。

この場合、ダウンロードが完了して実際にテクスチャを使用しなかったとしてもテクスチャを取得して解放するか、DownloadHandlerTexture.GetContentで取得だけしてResources.UnloadUnusedAssets呼び出す必要がある。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class DownloadTextureTest : MonoBehaviour
{
[SerializeField]
string url1 = null;
[SerializeField]
string url2 = null;
// テクスチャがリークする
IEnumerator DownloadTest1(string url)
{
using (var uwr = UnityWebRequestTexture.GetTexture(url))
{
yield return uwr.SendWebRequest();
if (!uwr.isNetworkError && !uwr.isHttpError)
{
Debug.Log("test1 complete.");
}
else
{
Debug.LogError(uwr.error);
}
}
System.GC.Collect();
Resources.UnloadUnusedAssets();
}
// リークしない
IEnumerator DownloadTest2(string url)
{
using (var uwr = UnityWebRequestTexture.GetTexture(url))
{
yield return uwr.SendWebRequest();
if (!uwr.isNetworkError && !uwr.isHttpError)
{
var tex = DownloadHandlerTexture.GetContent(uwr);
Debug.Log("test2 complete.");
}
else
{
Debug.LogError(uwr.error);
}
}
System.GC.Collect();
Resources.UnloadUnusedAssets();
}
void Start()
{
StartCoroutine(DownloadTest1(url1));
StartCoroutine(DownloadTest2(url2));
}
private void OnGUI()
{
if (GUILayout.Button("Download Test1", GUILayout.Width(200), GUILayout.Height(100)))
{
StartCoroutine(DownloadTest1(url1));
}
if (GUILayout.Button("Download Test2", GUILayout.Width(200), GUILayout.Height(100)))
{
StartCoroutine(DownloadTest2(url2));
}
}
}


コメントを残す

カテゴリー