- Home /
Memory leak in Texture2D.Apply()?
Hello,
I'm creating a texture from a list of bytes which I get from external source. When using a new list each frame, there is a memory leak both in Unity Editor and the runtime app. If I use the same list there is no memory leak.
However, even when I use a new list, if I comment out the line newTexture.Apply(); then there is no memory leak. Which leads me to suspect the Apply() method.
I asked in several forums and did not find a solution.
You can download the minimal project to reproduce the problem here: https://goo.gl/axFJDs
Here is the script:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class testMemory : MonoBehaviour {
public bool useNewList = false;
Texture2D newTexture;
public byte color;
List<Color> newColors;
List<byte> staticPixelColorsList;
Color tempColor = Color.white;
// Use this for initialization
void Start () {
newTexture = new Texture2D(0,0);
newColors = new List<Color>();
staticPixelColorsList = new List<byte>(120000);
GetComponent<Renderer>().material.mainTexture = newTexture;
}
// Update is called once per frame
void Update () {
// Make sure we're using different colors for every frame
color = (byte)((Time.time*255) % 255);
if(useNewList)
{
// This option causes a memory leak, but it's the one I need
// because I'm getting the texture data from an external source
int newWidth = Random.Range(200,400);
int newHeight = Random.Range(200,400);
// Create a new list each time
List<byte> newPixels = new List<byte>(newWidth * newHeight);
for(int i = 0; i < newWidth * newHeight; i++)
{
newPixels.Add ((byte)(color * i / 120000f));
}
setTexture(newPixels, newWidth, newHeight);
// Clear the list (yeah, right)
newPixels.Clear ();
}
else
{
// Use the same list, but assign new colors
for(int i = 0; i < 120000; i++)
{
staticPixelColorsList.Add ((byte)(color * i / 120000f));
}
setTexture(staticPixelColorsList, 300, 400);
staticPixelColorsList.Clear ();
}
}
void setTexture(List<byte> inputPixels, int inputWidth, int inputHeight)
{
newTexture.Resize(inputWidth, inputHeight);
float colorValue;
// Convert input value to Unity's "Color"
for(int n = 0; n < newTexture.width * newTexture.height ; n++)
{
colorValue = inputPixels[n] / 255.0f;
tempColor.r = tempColor.g = tempColor.b = colorValue;
newColors.Add (tempColor);
}
// Actually set the texture pixels
newTexture.SetPixels(newColors.ToArray());
newTexture.Apply();
newColors.Clear();
}
}
Thanx in advance.
I ran the $$anonymous$$imal project provided and memory usage stayed within the same 10kb range the whole time according to the windows task manager. Whatever's happening is not platform-universal. Try updating your graphics drivers.
Thanks. Did you toggle the useNewList boolean on and off during runtime, and watched the memory usage when it was on?
Ah, the boolean changes things. I am definitely seeing a very permanent memory leak now; I have to close Unity to get it to go away.
It seems that whether the list is new or not is not the deter$$anonymous$$ing factor, though. I found that the problem disappears when newWidth and newHeight are changed to constants. So perhaps it has something to do with resizing the texture. I'll keep messing around and let you know if I find anything.
Thanks. Try just commenting out the newTexture.Apply() line, it will prevent the leak (along with the functionality)
Interesting. I'm all but certain the resizing is what's causing it though. If you just comment out the Resize call (and make the initial texture 200x200 to prevent errors) the leak goes away.
Your answer
Follow this Question
Related Questions
A node in a childnode? 1 Answer
When is a referenced texture actually loaded? 0 Answers
When is a referenced texture actually loaded? 0 Answers
the texture appear rubbish 1 Answer
Terrain not unloading texture. 0 Answers