Мое приложение Unity продолжает использовать все больше и больше оперативной памяти, пока не выйдет из строя после загрузки большого количества внешних изображений. - PullRequest
0 голосов
/ 04 августа 2020

У меня есть приложение unity, которое должно было быть сделано в winforms, но я использовал unity, b c. Приложение загружает внешние изображения, если они существуют. проблема в том, что Unity использует все больше и больше оперативной памяти, пока не выйдет из строя. Я знаю это изображения, потому что я добавил функцию отключения загрузки изображений, и это устранило проблему, мне нужна помощь, чтобы мое приложение перестало использовать так много оперативной памяти !!

вот код, который я использовал, ( это все не мое)

StartCoroutine("FindImage");

public IEnumerator FindImage()
{
    var a = FolderLocationPath;
    /*
    while (!Main.EnableSelected)
    {
        yield return new WaitForSeconds(0.1f);
    }*/
    try
    {
        ModViewImage.sprite = LoadNewSprite(a + @"\preview.jpg");
    }
    catch
    {
        try
        {
            ModViewImage.sprite = LoadNewSprite(a + @"\preview.png");
        }
        catch 
        { 
            Debug.LogWarning("--No-Image--" + a.Replace(Main.GetMain.FolderPath, "")); 
        }
    }
    yield return null;
}


public Sprite LoadNewSprite(string FilePath, float PixelsPerUnit = 0.01f)
{

    // Load a PNG or JPG image from disk to a Texture2D, assign this texture to a new sprite and return its reference

    Texture2D SpriteTexture = LoadTexture(FilePath);
    Sprite NewSprite = Sprite.Create(SpriteTexture, new Rect(0, 0, SpriteTexture.width, SpriteTexture.height), new Vector2(0, 0), PixelsPerUnit);

    return NewSprite;
}




public Texture2D LoadTexture(string FilePath)
{

    // Load a PNG or JPG file from disk to a Texture2D
    // Returns null if load fails

    Texture2D Tex2D;
    byte[] FileData;

    if (System.IO.File.Exists(FilePath))
    {
        FileData = System.IO.File.ReadAllBytes(FilePath);
        Tex2D = new Texture2D(1, 1);           // Create new "empty" texture
        if (Tex2D.LoadImage(FileData))
        {
            Tex2D.anisoLevel = 1;
            Tex2D.filterMode = FilterMode.Point;
            Tex2D.Apply();
            return Tex2D;
        }            // If data = readable -> return texture
    }
    return null;                     // Return null if load failed
}

1 Ответ

0 голосов
/ 06 августа 2020

По моему личному мнению; Первое, что вы всегда должны делать, когда сталкиваетесь с проблемой памяти / производительности, это использовать профилировщик .

Там вы сможете увидеть, что на самом деле поглощает всю вашу оперативную память, и с помощью профилировщика ЦП вы можете увидеть распределение сборки мусора, чтобы узнать, есть ли там подозреваемые.

Я бы посоветовал в будущем использовать профилировщик, как только вы столкнетесь с подобной проблемой. При этом из кода, который вы включили, я не думаю, что возможно точно сказать, где ваша проблема.

Некоторые общие предложения:

  1. Если вам не нужно чтобы иметь доступ для чтения / записи к данным / пикселям текстуры, отправьте false во 2-м параметре Texture2D.LoadTexture, чтобы пометить его как нечитаемое; это фактически снижает потребление ОЗУ на 50% для каждой текстуры, загруженной в память, и требуется только в том случае, если вы управляете / считываете данные из текстуры.
  2. Из-за использования устаревшей функции LoadTexture, я думаю, вы работают на Unity 5.3 или около того; Я настоятельно рекомендую обновить Unity до более ... с текущего десятилетия, что, скорее всего, улучшит вашу производительность в целом и устранит различные утечки памяти в движке, которые могут вызывать это.
  3. Все в управляемом код нужно разыменовать, когда вы закончите с ним; если вы загружаете эти изображения и где-то храните ссылку, они не будут освобождены из памяти, и это также может быть причиной вашей проблемы.
...