【问题标题】:fastest method to capture game screen shots in c#?(more than20 images per second)在c#中捕获游戏截图的最快方法?(每秒超过20张图像)
【发布时间】:2011-11-03 09:44:01
【问题描述】:

如何快速截取整个游戏屏幕?每秒 20-30 次?(我想将它们转换为视频)

[[1]] 我试过 WMEncoder。结果是 WMEncoder 只能使用一组预配置的编解码器以视频格式 (wma) 捕获屏幕和屏幕区域。 (29 fps 最佳编码结果)。WMEncoder 无法截图。

[[2]] 我试过 DirectX:

Surface s = device.CreateOffscreenPlainSurface(
Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height,
Format.A8R8G8B8, Pool.SystemMemory);
device.GetFrontBufferData(0, s);
SurfaceLoader.Save("c:\\Screenshot"+i.ToString()+".bmp", ImageFileFormat.Bmp, s);

这就像 gdi ..非常慢....它只在 DirectX 1.0 中有效,因为在 DirectX 2.0 中不存在 SurfaceLoader

我在一些帖子中读到的另一种方法是使用:

s = device.GetBackBuffer(0, 0, Microsoft.DirectX.Direct3D.BackBufferType.Mono);

,但这只会将屏幕截图显示到当前窗口。

[[3]] 我尝试使用 Taksi(在 sourceforge.net)...但我不知道如何在 c# 中使用它并使其工作。

请帮帮我...

【问题讨论】:

  • 您提到了 GDI,您使用的是 Bitblt 还是 System.Drawing 命名空间?这在性能上有很大的不同。
  • 所以你不想拍视频,只是因为性能问题(不知道会不会影响性能)?在完成其余工作后转换它们?我想知道你为什么只拍视频,它会更简单。编辑:我看到你的另一个问题是拍摄视频。这很奇怪,我认为人们对截屏比拍摄视频更感兴趣。
  • 嗯,当我使用这个捕获游戏屏幕但不知道它是快还是慢:codeproject.com/KB/cs/DesktopCaptureWithMouse.aspx

标签: c# screenshot direct3d screen-capture image-capture


【解决方案1】:

您真的很想挂接到 directx,这样您就可以像游戏/应用程序一样进行调用。以下是一些这样做的网站(大多数都画了额外的东西,但我不明白为什么你不能每 x 帧保存一次后备缓冲区):

http://www.gamedev.net/topic/359794-c-direct3d-hooking-sample/

Disclamer:我没有尝试过这个,所以不确定你能得到什么 FPS,但我认为这是最快的方法,因为你可以在游戏中有效地做到这一点。

【讨论】:

  • 这也是唯一有保证的方法,因为根据设备的设置方式,您可能只会得到一个黑色矩形。
  • @Jonathan,真的,我相信黑色矩形会是设备未设置为共享时(忘记确切的术语)。
猜你喜欢
  • 2015-01-19
  • 2020-01-16
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多