gpt4 book ai didi

c# - 为什么我的不安全代码块比我的安全代码块慢?

转载 作者:太空狗 更新时间:2023-10-29 20:02:10 25 4
gpt4 key购买 nike

我正在尝试编写一些代码来方便地处理视频帧。我正在接收作为 System.Windows.Media.Imaging.WriteableBitmap 的帧。出于测试目的,我只是应用了一个简单的阈值过滤器,该过滤器将处理 BGRA 格式图像并根据 BGR 像素的平均值将每个像素分配为黑色或白色。

这是我的“安全”版本:

public static void ApplyFilter(WriteableBitmap Bitmap, byte Threshold)
{
// Let's just make this work for this format
if (Bitmap.Format != PixelFormats.Bgr24
&& Bitmap.Format != PixelFormats.Bgr32)
{
return;
}

// Calculate the number of bytes per pixel (should be 4 for this format).
var bytesPerPixel = (Bitmap.Format.BitsPerPixel + 7) / 8;

// Stride is bytes per pixel times the number of pixels.
// Stride is the byte width of a single rectangle row.
var stride = Bitmap.PixelWidth * bytesPerPixel;

// Create a byte array for a the entire size of bitmap.
var arraySize = stride * Bitmap.PixelHeight;
var pixelArray = new byte[arraySize];

// Copy all pixels into the array
Bitmap.CopyPixels(pixelArray, stride, 0);

// Loop through array and change pixels to black/white based on threshold
for (int i = 0; i < pixelArray.Length; i += bytesPerPixel)
{
// i=B, i+1=G, i+2=R, i+3=A
var brightness =
(byte)((pixelArray[i] + pixelArray[i+1] + pixelArray[i+2]) / 3);

var toColor = byte.MinValue; // Black

if (brightness >= Threshold)
{
toColor = byte.MaxValue; // White
}

pixelArray[i] = toColor;
pixelArray[i + 1] = toColor;
pixelArray[i + 2] = toColor;
}
Bitmap.WritePixels(
new Int32Rect(0, 0, Bitmap.PixelWidth, Bitmap.PixelHeight),
pixelArray, stride, 0
);
}

这是我认为是使用不安全代码块和 WriteableBitmap 后备缓冲区而不是前缓冲区的直接翻译:

public static void ApplyFilterUnsafe(WriteableBitmap Bitmap, byte Threshold)
{
// Let's just make this work for this format
if (Bitmap.Format != PixelFormats.Bgr24
&& Bitmap.Format != PixelFormats.Bgr32)
{
return;
}

var bytesPerPixel = (Bitmap.Format.BitsPerPixel + 7) / 8;

Bitmap.Lock();

unsafe
{
// Get a pointer to the back buffer.
byte* pBackBuffer = (byte*)Bitmap.BackBuffer;

for (int i = 0;
i < Bitmap.BackBufferStride*Bitmap.PixelHeight;
i+= bytesPerPixel)
{
var pCopy = pBackBuffer;
var brightness = (byte)((*pBackBuffer
+ *++pBackBuffer
+ *++pBackBuffer) / 3);
pBackBuffer++;

var toColor =
brightness >= Threshold ? byte.MaxValue : byte.MinValue;

*pCopy = toColor;
*++pCopy = toColor;
*++pCopy = toColor;
}
}

// Bitmap.AddDirtyRect(
// new Int32Rect(0,0, Bitmap.PixelWidth, Bitmap.PixelHeight));
Bitmap.Unlock();

}

这是我第一次涉足不安全的代码块和指针,所以逻辑可能不是最优的。

我在同一个 WriteableBitmaps 上测试了两个代码块:

var threshold = Convert.ToByte(op.Result);
var copy2 = copyFrame.Clone();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
BinaryFilter.ApplyFilterUnsafe(copyFrame, threshold);
stopWatch.Stop();

var unsafesecs = stopWatch.ElapsedMilliseconds;
stopWatch.Reset();
stopWatch.Start();
BinaryFilter.ApplyFilter(copy2, threshold);
stopWatch.Stop();
Debug.WriteLine(string.Format("Unsafe: {1}, Safe: {0}",
stopWatch.ElapsedMilliseconds, unsafesecs));

所以我正在分析同一张图片。传入视频帧流的测试运行:

Unsafe: 110, Safe: 53
Unsafe: 136, Safe: 42
Unsafe: 106, Safe: 36
Unsafe: 95, Safe: 43
Unsafe: 98, Safe: 41
Unsafe: 88, Safe: 36
Unsafe: 129, Safe: 65
Unsafe: 100, Safe: 47
Unsafe: 112, Safe: 50
Unsafe: 91, Safe: 33
Unsafe: 118, Safe: 42
Unsafe: 103, Safe: 80
Unsafe: 104, Safe: 34
Unsafe: 101, Safe: 36
Unsafe: 154, Safe: 83
Unsafe: 134, Safe: 46
Unsafe: 113, Safe: 76
Unsafe: 117, Safe: 57
Unsafe: 90, Safe: 41
Unsafe: 156, Safe: 35

为什么我的不安全版本总是比较慢?是因为使用了后台缓冲区吗?还是我做错了什么?

谢谢

最佳答案

可能是因为您的不安全版本正在进行乘法和属性访问:

Bitmap.BackBufferStride*Bitmap.PixelHeight

在每次循环迭代中。将结果存储在变量中。

关于c# - 为什么我的不安全代码块比我的安全代码块慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com