3

アンマネージメモリをマネージバイト配列に読み込む必要があります。

このために、アンマネージメモリへのIntPtr参照と、関心のあるアンマネージメモリのサイズを表す長さがあります。

次のコードを使用して、それをマネージドバイト配列に読み込みます。

            byte[] pixelDataArray = new byte[pixelDataLength];
            for (int i = 0; i < pixelDataLength; i++) {
                pixelDataArray[i] = Marshal.ReadByte(pixelData, i);
            }

ただし、これによりパフォーマンスが非常に低下します。256KBのアンマネージメモリを使用してこのメ​​ソッドを1000回呼び出すと、7秒以上かかります。これを行うにはもっと効率的な方法があるはずだと思います。

事前に読み取る必要のあるメモリのサイズがわからないため、Marshal.PtrToStructureを使用できませんでした。

この機能のパフォーマンスをどのように改善できるかについてのアイデアはありますか?

4

2 に答える 2

6

ループする代わりに、チャンク全体をコピーしてみてください。

Marshal.Copy(pixelData, pixelDataArray, 0, pixelDataLength);
于 2011-09-23T06:23:56.880 に答える
3

を使用しMarshal.Copy()ます。

byte[] pixelDataArray = new byte[pixelDataLength];
Marshal.Copy(pixelData, pixelDataArray, 0, pixelDataArray.Length);
于 2011-09-23T06:24:42.527 に答える