UnityWebRequestTextureを使って画像をダウンロードしたときにテクスチャが解放されずリークしてしまうパターンがあった。(Unity 2018.4)
通常、UnityWebRequestTexture.GetTextureで画像をダウンロードしたあとDownloadHandlerTexture.GetContentでテクスチャを取得してUIに表示する。この場合、テクスチャを使わなくなったときにDestroyするかResources.UnloadUnusedAssetsを呼べばテクスチャは解放される。
ただし次のようにダウンロードしたあとにテクスチャにアクセスせずにUnityWebRequestを削除してしまった場合にResources.UnloadUnusedAssetsを呼び出してもダウンロードしたテクスチャが解放されなくなってしまう。
この場合、ダウンロードが完了して実際にテクスチャを使用しなかったとしてもテクスチャを取得して解放するか、DownloadHandlerTexture.GetContentで取得だけしてResources.UnloadUnusedAssets呼び出す必要がある。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} | |
} |
コメントを残す