2

を使用してノイズ マップを作成するプロジェクトを取り上げましたsetPixel()。このアプリケーションの実行時間の大部分は関数内で費やされるsetPixel()ため、関数の実行速度を上げることを検討していました。

これについていくつかの調査を行ったところ、次のことがわかりました。

int index = x + (y * Width);
int col = color.ToArgb();

if (this.Bits == null)
{
    this.Bits = new Int32[Width * Height];
}

Bits[index] = col;

より迅速なアプローチとして推奨されています。ただし、これは完全に黒い画像を生成しています。

コードを完全に理解し、より良いものにリファクタリングできるようにするために、画像操作とメモリポインターがどのように機能するかを100%理解していません。

実装前の元のコードは次のとおりです。

            unsafe
            {
                var scan0 = (byte*)Iptr;
                int bitmapStride = Stride;
                int bitmapPixelFormatSize = Depth / 8;

                index = (bitmapStride * y) + (x * bitmapPixelFormatSize);
                if (bitmapPixelFormatSize == 4)
                {
                    scan0[index + 3] = color.A;
                    scan0[index + 2] = color.R;
                    scan0[index + 1] = color.G;
                    scan0[index] = color.B;

                }
                else if (bitmapPixelFormatSize == 1)
                {
                    scan0[index] = color.R;

                }
                else
                {
                    scan0[index + 2] = color.R;
                    scan0[index + 1] = color.G;
                    scan0[index] = color.B;

                }
            }

IptrただのIntPtrです

Strideはintです。これが設定されているのを見つけることができる唯一の場所はStride = (PixelCount/Height) * (Depth / 8)

x幅です

y身長です

元のコード ブロックで何が起こっているかについての説明を得ることができますか。また、それをより速く実行するものに変換する方法を理解するのに役立つ可能性があります。現在、ネストされた for ループのために、この関数を完了するのに約 500,000 ミリ秒かかります。幅×高さ。

4

1 に答える 1