C# 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加载图像

这是代码

            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
}