ビデオをレンダリングするため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がこれらの例外を引き起こしている可能性はありますか? たまにしか起こらないのはなぜですか?