为什么我的不安全代码阻塞比我的安全代码慢?我正在尝试编写一些代码来方便地处理视频帧。我接收的帧为System.Windows.Media.Imaging.WriteableBitmap。出于测试目的,我只是对BGRA格式图像应用了一个简单的阈值过滤器,并根据BGR像素的平均值将每个像素分配为黑色或白色。这是我的“安全”版本:publicstaticvoidApplyFilter(WriteableBitmapBitmap,byteThreshold){//让我们为这种格式工作if(Bitmap.Format!=PixelFormats.Bgr24&&Bitmap.Format!=PixelFormats.Bgr32){返回;}//计算每个像素的字节数(对于这种格式应该是4)。varbytesPerPixel=(Bitmap.Format.BitsPerPixel+7)/8;//步幅是每像素字节数乘以像素数。//Stride是单个矩形行的字节宽度。varstride=Bitmap.PixelWidth*bytesPerPixel;//为整个位图大小创建一个字节数组。vararraySize=stride*Bitmap.PixelHeight;varpixelArray=newbyte[arraySize];//将所有像素复制到数组中Bitmap.CopyPixels(pixelArray,stride,0);//遍历数组并根据阈值将像素更改为黑色/白色for(inti=0;i=Threshold){toColor=byte.MaxValue;//白色}pixelArray[i]=toColor;pixelArray[i+1]=toColor;pixelArray[i+2]=toC颜色;}Bitmap.WritePixels(newInt32Rect(0,0,Bitmap.PixelWidth,Bitmap.PixelHeight),pixelArray,stride,0);以下是我认为使用不安全代码块和WriteableBitmapBackBuffer而不是forebuffer的直接方式.Format!=PixelFormats.Bgr24&&Bitmap.Format!=PixelFormats.Bgr32){返回;}varbytesPerPixel=(Bitmap.Format.BitsPerPixel+7)/8;位图.Lock();unsafe{//获取指向后台缓冲区的指针。byte*pBackBuffer=(byte*)Bitmap.BackBuffer;for(inti=0;i=Threshold?byte.MaxValue:byte.MinValue;*pCopy=toColor;*++pCopy=toColor;*++pCopy=toColor;}}//Bitmap.AddDirtyRect(//newInt32Rect(0,0,Bitmap.PixelWidth,Bitmap.PixelHeight));Bitmap.Unlock();}这是我第一次涉足不安全的块和指针,所以逻辑可能不是最优的我使用以下方法在相同的WriteableBitmaps上测试了两个代码块:varthreshold=Convert.ToByte(op.Result);varcopy2=copyFrame.Clone();秒表stopWatch=newStopwatch();stopWatch.Start();BinaryFilter.ApplyFilterUnsafe(copyFrame,threshold);stopWatch.Stop();varunsafesecs=stopWatch.ElapsedMilliseconds;stopWatch.Reset();stopWatch.Start();Debug.WriteLine(string.Format("不安全:{1},安全:{0}",stopWatch.ElapsedMilliseconds,unsafesecs));所以我正在分析同一张图片。传入视频帧流的测试运行:不安全:110,安全:53不安全:136,安全:42不安全:106,安全:36不安全:95,安全:43不安全:98,安全:41不安全:88,安全:36不安全:129,安全:65不安全:100,安全:47不安全:112,安全:50不安全:91,安全:33不安全:118,安全:42不安全:103,安全:80不安全:104,安全:34不安全:101,安全:36不安全:154,安全:83不安全:134,安全:46不安全:113,安全:76不安全:117,安全:57不安全:90,安全:41不安全:156,安全:35为什么我的不安全的版本总是比较慢?是因为使用了后台缓冲区吗?还是我做错了什么?谢谢也许是因为您的不安全版本正在执行乘法和属性访问:Bitmap.BackBufferStride*Bitmap.PixelHeight在每次循环迭代中。将结果存储在变量中。安全或不安全代码的进一步优化:停止在循环内除以3。在循环外将阈值乘以3。您将需要使用字节以外的一些类型,但这应该不是问题。事实上,你使用了比byte更大的数据类型:)如果不分析代码就很难说,特别是因为代码非常不同(虽然起初看起来很相似)一些关键点(它们都只是猜测)ifin在unsafe版本中计算出的ifnotinsafe,那么停止条件这就是我能想到的所有想法。希望这可以帮助。以上是C#学习教程:为什么我的不安全代码阻塞比我的安全代码慢?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
