J'ai une fuite de mémoire quelque part. Je l'ai cherché tant de fois, et cela me semble solide. Je ne peux pas ... le trouver ... Ok, arrière-plan. C'est un remplissage d'inondation piloté par pile, et ce bit de code est le seul endroit où j'ajoute quelque chose à la pile. Il y a plus de code, donc si personne ne peut trouver de fuite de mémoire, j'en posterai un peu plus.Algorithme de remplissage d'inondation fuite de mémoire
Voici la partie la plus étrange à ce sujet. Le code fonctionne bien avec une seule couleur + dessin au trait (pictexture), mais lorsque vous utilisez plus d'une couleur et que vous utilisez le seau de remplissage, j'obtiens ces fuites de mémoire étranges.
//descend to the floor
while(true)
{
if(++iterator > total)
{
Debug.Log("broke in the stupid down loop...");
break;
}
//if we hit line art or a color we're not changing, break out of the loop
if(PicTexture.GetPixel((int)coords.x, (int)coords.y).a > .5f ||
MyTexture.GetPixel((int)coords.x, (int)coords.y) != ColorToChange || coords.y < 0)
{
break;
}
//if we're looking right and find an open spot in our texture
if(reach.right && MyTexture.GetPixel((int)coords.x + 1, (int)coords.y) == ColorToChange
&& PicTexture.GetPixel((int)coords.x + 1, (int)coords.y).a < .5f)
{
reach.right = false; //search it and stop looking right
if(!search.Contains(new Vector2((int)coords.x + 1, (int)coords.y)))
search.Push(new Vector2((int)coords.x + 1, (int)coords.y));
}
else
{
if(MyTexture.GetPixel((int)coords.x + 1, (int)coords.y) != ColorToChange
|| PicTexture.GetPixel((int)coords.x + 1, (int)coords.y).a >= .5f) //if theres a wall and we're not looking right
reach.right = true; //look for an opening to the rightq
}
//same thing for left
if(reach.left && MyTexture.GetPixel((int)coords.x - 1, (int)coords.y) == ColorToChange
&& PicTexture.GetPixel((int)coords.x - 1, (int)coords.y).a < .5f)
{
reach.left = false;
if(!search.Contains(new Vector2((int)coords.x - 1, (int)coords.y)))
search.Push(new Vector2((int)coords.x - 1, (int)coords.y));
}
else
{
if(MyTexture.GetPixel((int)coords.x - 1, (int)coords.y) != ColorToChange
|| PicTexture.GetPixel((int)coords.x - 1, (int)coords.y).a >= .5f)
reach.left = true;
}
MyTexture.SetPixel((int)coords.x, (int)coords.y, BrushColor);
coords.y--;
}
edit: Je viens de réaliser que j'ai oublié de mentionner la partie la plus étrange. Ce code fonctionne très bien jusqu'à ce que j'utilise des couleurs autres que la couleur de départ (bleu). Une fois que je change de couleur, même si elle est de retour au bleu, elle se casse toujours.
Comment savez-vous que vous avez une fuite de mémoire? Quels sont les symptômes que vous ressentez? Quels outils de débogage avez-vous utilisés pour essayer d'identifier la source de la fuite? Qu'ont-ils montré? –
J'utilise Debug.Log() d'Unity pour lancer des instructions de débogage afin de voir la taille de la pile de recherche, et cet itérateur pour me sortir de la boucle s'il est bloqué. Lorsque j'utilise une seule couleur, la taille de la pile ne dépasse jamais 75, et l'itérateur maintient un nombre raisonnable. J'ai cassé la boucle à 600 000 itérations et à une taille de pile de 100 afin de ne pas planter le programme. –
Je ne pense pas que ce soit une fuite de mémoire mais un problème avec votre algorithme – Carsten