1

どこかでメモリリークが発生しました。私は何度もそれを検索しました、そしてそれは私にはしっかりしているように見えます。私はただ..見つけることができません...それを見つける...わかりました、背景。これはスタック駆動のフラッドフィルであり、このコードのビットは、スタックに何かを追加する唯一の場所です。より多くのコードがあるので、誰もメモリリークを見つけることができない場合は、さらにいくつか投稿します。

これについて最も奇妙な部分があります。コードは1つの色+線画(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--;
            }   

編集:私はちょうど私が最も奇妙な部分に言及するのを忘れたことに気づきました。このコードは、開始色(青)以外の色を使用するまでは問題なく機能します。色を変えたら、青に戻っても壊れてしまいます。

4

2 に答える 2

2

まず、プロファイラーを使用します。RedGate の ANTS Memory Profilerで楽しい経験をしました。問題が明らかでない場合に、必要な情報を取得するための最も迅速な方法です。

Vector2コードに関しては、一見しただけで、非常に短い時間で多数のオブジェクトを作成している可能性があることに気付きました。これが実際にあなたが見ている問題を引き起こしているかどうかはわかりません。

余談ですが、GDI+ は非常に遅いです。パフォーマンスの低下に気付き始めた場合は、 を使用Bitmap.LockBitsしてメモリ内の画像データへのポインタを取得し、それを操作することを検討してください。私の経験では、GDI+ は適度なサイズの画像の操作にも適していません。

于 2012-06-14T20:51:23.007 に答える
0

私はそれを考え出した。それは完全に私のせいではなかったことがわかりました。カラー ピッカー コードを書いた人は、私とは異なるカラー フォーマットを使用していましたが、私たちが使用しているエンジンは、あるフォーマットを別のフォーマットに暗黙的に変換することがあります。非常に奇妙です。みんな助けてくれてありがとう!

于 2012-06-21T17:07:15.980 に答える