C#哪种截屏速度最快?我正在实现一个功能,该功能将重复截取屏幕截图并在两个不同的镜头之间输出一个脏矩形,然后在窗口中重新绘制屏幕。我目前可以在20~30FPS之间运行。已经可以接受了。但后来我做了一个基准测试并测量了它的性能。Graphics.CopyFromScreen()被发现占用了高达50%的处理时间。(是的。即使在最坏的情况下,它仍然比找到所有脏矩形需要更长的时间)然后我使用本机API实现了BitBlt()并且没有得到任何改进。我知道在这种情况下可能没有任何实际理由让它比30FPS更快。我只是想知道,有没有更快的截屏方法?谢谢。这与几年前提出的一个问题非常相似:这里。那个问题是是否可以使用directx的捕获功能来获得更好的性能。共识是它可能不会提供任何性能提升,而TightVNC通过作弊很快就能做到这一点。它使用的驱动程序不必使用.NET(可能)正在使用的API。在某些时候,我记得看过Camstudio的源代码,我相信他们使用了directx的捕捉功能。我不认为你可以超过30fps,而且大多数时候你做不到。我不确定这是否是一个问题,是camstudio用来确定何时发生更改或实际捕获的机制。对于那些来到这个线程的人,我找到了这个解决方案:使用SharpDX;使用SharpDX.Direct3D11;使用SharpDX.DXGI;使用系统;使用系统诊断;使用系统绘图;使用System.Drawing.Imaging;使用System.IO;使用System.Threading.Tasks;您将需要SharpDX和SharpDX.Direct3D11包publicclassScreenStateLogger{privatebyte[]_previousScreen;私人布尔_run,_init;publicintSize{得到;私有集;}publicSc??reenStateLogger(){}publicvoidStart(){_run=true;varfactory=newFactory1();//获取第一个适配器varadapter=factory.GetAdapter1(0);//从适配器获取设备vardevice=newSharpDX.Direct3D11.设备(适配器);//获取适配器的前端缓冲区varoutput=adapter.GetOutput(0);varoutput1=output.QueryInterface();//要捕获的桌面宽度/高度intwidth=output.Description.DesktopBounds。正确的;intheight=output.Description.DesktopBounds.Bottom;//创建CPU可访问的暂存纹理vartextureDesc=newTexture2DDescription{CpuAccessFlags=CpuAccessFlags.Read,BindFlags=BindFlags.None,Format=Format.B8G8R8A8_UNorm,Width=width,Height=height,OptionFlags=ResourceOptionFlags.None,MipLevels=1,ArraySize=1,SampleDescription={Count=1,Quality=0},使用=ResourceUsage.Staging};varscreenTexture=newTexture2D(device,textureDesc);Task.Factory.StartNew(()=>{//使用复制输出(varduplicatedOutput=output1.DuplicateOutput(device)){while(_run){try{SharpDX.DXGI.ResourcescreenResource;OutputDuplicateFrameInformationduplicateFrameInformation;//尝试在给定时间内获取重复的帧是msduplicatedOutput.AcquireNextFrame(5,outduplicateFrameInformation,outscreenResource);//将资源复制到内存中,CPU可以使用(varscreenTexture2D=screenResource.QueryInterface())device.ImmediateContext.CopyResource(screenTexture2D,screenTexture);//获取桌面捕捉纹理varmapSource=device.ImmediateContext.MapSubresource(screenTexture,0,MapMode.Read,SharpDX.Direct3D11.MapFlags.None);//创建Drawing.Bitmap使用(varbitmap=newBitmap(width,height,PixelFormat.Format32bppArgb)){varboundsRect=newRectangle(0,0,width,height);//将像素从屏幕捕获纹理复制到GDI位图varmapDest=bitmap.LockBits(boundsRect,ImageLockMode.WriteOnly,bitmap.PixelFormat);varsourcePtr=mapSource.DataPointer;vardestPtr=mapDest.Scan0;for(inty=0;yScreenRefreshed;}此代码将尽快从图形设备的前端缓冲区获取帧,并从它创建的位图中检索byte[]该代码在内存方面似乎处于稳定状态,并且处理器使用(GPU和CPU)。用法:varscreenStateLogger=newScreenStateLogger();screenStateLogger.ScreenRefreshed+=(sender,data)=>{//数据中的新帧};screenStateLogger.Start();替换CopyFromScreen()检查这个。注意Graphics.CopyFromScreen()本身调用APIBitBlt()从屏幕复制,您可以使用Reflector检查源代码。以上就是C#学习教程:C#中哪个屏幕截图速度最快?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
