ビデオをレンダリングするためBitmap
に Direct3Dにコピーするコードがいくつかあります。Texture
システムの負荷が高い場合、 へAccessViolationException
の呼び出しで時折 が表示されBitmap.LockBits
ます。
何が起こるかの非常に簡単な例を次に示します。
// Get a PixelFormat.Format24bppRgb image
Bitmap bitmap24 = getVideoFrame();
// Copy into a 32bpp ARGB texture
BitmapData bitmapData = null;
try
{
// Why am I allowed to do this?
bitmapData = this.bitmap24.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly,
PixelFormat.Format32bppArgb);
// Blit from bitmapData to texture32
Texture texture32 = convertBitmapToTexture(bitmapData);
}
finally
{
if (bitmapData != null)
this.bitmap.UnlockBits(bitmapData);
}
ビットマップBitmap.LockBits
形式PixelFormat.Format32bppArgb
がPixelFormat.Format24bppRgb
. LockBits
ピクセルあたり 3 バイトから 4 バイトに自動的に拡張する必要があると思います。
拡張LockBits
がこれらの例外を引き起こしている可能性はありますか? たまにしか起こらないのはなぜですか?