C# UnityWebRequest在重复加载图像时需要填充内存
我正在使用UnityWebRequest加载图像 这是代码C# UnityWebRequest在重复加载图像时需要填充内存,c#,unity3d,memory,unitywebrequest,C#,Unity3d,Memory,Unitywebrequest,我正在使用UnityWebRequest加载图像 这是代码 UnityWebRequest uwr; StartCoroutine(LoadImageCorroutine()); IEnumerator LoadImageCorroutine() { using (uwr = UnityWebRequestTexture.GetTexture(@"file:///C:/
UnityWebRequest uwr;
StartCoroutine(LoadImageCorroutine());
IEnumerator LoadImageCorroutine()
{
using (uwr = UnityWebRequestTexture.GetTexture(@"file:///C://UnityTests/Filerepository/Items/3faju5ozafrz.png"))
{
yield return uwr.SendWebRequest();
rawImage.texture = DownloadHandlerTexture.GetContent(uwr);
//Debug.Log(i.ToString());
}
uwr.Dispose();
StopCoroutine(LoadImageCorroutine());
}
我运行了一些性能测试,并注意到内存使用率在每次调用协同程序时都会不断上升,但之后没有下降
考虑到CPU负载随着时间的推移而下降,协程似乎要么正确停止,要么至少处于空闲状态
我该如何摆脱UnityWebRequest加载到我记忆中的任何东西?我自己以前就遇到过这个问题。您可以通过使用和执行
- 单击内存模块
- 在底部,从“简单”切换到“详细”
- 点击Take Sample
- 签出“资产”&右箭头;“纹理2D”
UnityWebRequestTexture.GetTexture下载的任何Texture
都是未收集的即使它不再被引用!因此,每次运行协同程序都会向内存中添加一个纹理实例
为了解决这个问题,一旦你知道你真的想要破坏纹理,你必须“手动”这样做:
IEnumerator LoadImageCorroutine()
{
使用(var uwr=UnityWebRequestTexture.GetTexture(@)file:///C://UnityTests/Filerepository/Items/3faju5ozafrz.png"))
{
产生返回uwr.SendWebRequest();
//我总是先检查错误
if(uwr.ishttperor | | uwr.isNetworkError)
{
Debug.LogError($”无法将纹理do加载到{uwr.responseCode}-\“{uwr.error}\”,this);
屈服断裂;
}
//销毁当前纹理实例
if(rawImage.texture)
{
破坏(原始图像、纹理);
}
rawImage.texture=DownloadHandlerTexture.GetContent(uwr);
//Log(i.ToString());
}
//由于您使用的是“using”,因此无需手动调用Dispose()
//无论如何,这是你的合作计划的结束。你不想打电话吗
//此处为StopCorroutine(loadImageCorrutine())
}
谢谢你解决了这个问题。
IEnumerator LoadImageCorroutine()
{
using (var uwr = UnityWebRequestTexture.GetTexture(@"file:///C://UnityTests/Filerepository/Items/3faju5ozafrz.png"))
{
yield return uwr.SendWebRequest();
// I would always check for errors first
if(uwr.isHttpError || uwr.isNetworkError)
{
Debug.LogError($"Could not load texture do to {uwr.responseCode} - \"{uwr.error}\"", this);
yield break;
}
// Destroy the current texture instance
if(rawImage.texture)
{
Destroy(rawImage.texture);
}
rawImage.texture = DownloadHandlerTexture.GetContent(uwr);
//Debug.Log(i.ToString());
}
// since you are using "using" there is no need to call Dispose() manually
// This is anyway the end of your coroutine .. you do not want to call
// StopCoroutine(LoadImageCorroutine()) here
}