洪水填充算法内存泄漏

时间:2012-06-14 20:45:44

标签: c# memory-leaks unity3d paint flood-fill

我某处有内存泄漏。我已经多次搜索了它,它看起来很坚固。我只是......不能......找到它...... 好的,背景。这是一个堆栈驱动的泛洪填充,这段代码是我向堆栈添加内容的唯一位置。有更多的代码,所以如果没有人能找到内存泄漏,我会发布更多的代码。

这是关于此的最奇怪的部分。代码只使用一种颜色+线条艺术(pictexture)就可以正常工作,但是当使用多种颜色并使用填充桶时,我会得到那些奇怪的内存泄漏。

 //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--;
            }   

编辑:我刚刚意识到我忘了提到最奇怪的部分。此代码工作正常,直到我使用除起始颜色(蓝色)以外的颜色。一旦我改变颜色,即使它变回蓝色,它仍然会破裂。

2 个答案:

答案 0 :(得分:2)

首先,使用分析器。我和RedGate's ANTS Memory Profiler有过愉快的经历。当问题不明显时,这是获取所需信息的最快捷方式。

至于你的代码,乍一看我注意到你可能会在很短的时间内创建大量Vector2个对象。我不知道这是否真的导致你看到的问题。

顺便说一句,GDI +像狗一样慢。如果您开始注意到性能不佳,可能需要考虑使用Bitmap.LockBits来获取指向内存中图像数据的指针并对其进行操作。根据我的经验,GDI +根本不适合对尺寸适中的图像进行操作。

答案 1 :(得分:0)

我明白了。事实证明这不完全是我的错。编写颜色选择器代码的人使用的颜色格式与我不同,但我们有时使用的引擎会隐式地将一种格式转换为另一种格式,这就是为什么它仍然有效。非常奇怪。 感谢你们的帮助!

相关问题