【发布时间】:2011-07-01 10:40:38
【问题描述】:
我想为 Windows 平台编写一个截屏程序,但不确定如何截屏。我知道的唯一方法是使用 GDI,但我很好奇是否还有其他方法可以解决这个问题,如果有,哪种方法会产生最少的开销?速度是重中之重。
截屏程序将用于录制游戏画面,但如果这确实缩小了选项范围,我仍然愿意接受超出此范围的任何其他建议。毕竟,知识并不坏。
编辑:我看到了这篇文章:Various methods for capturing the screen。它向我介绍了 Windows Media API 的执行方式和 DirectX 的执行方式。它在结论中提到,禁用硬件加速可以显着提高捕获应用程序的性能。我很好奇这是为什么。有谁能帮我填一下空缺吗?
编辑:我读到 Camtasia 等截屏程序使用自己的捕获驱动程序。有人可以给我一个深入的解释它是如何工作的,为什么它更快?我可能还需要有关实施类似内容的指导,但我确信无论如何都有现有的文档。
另外,我现在知道 FRAPS 是如何记录屏幕的。它挂钩底层图形 API 以从后台缓冲区读取。据我了解,这比从前缓冲区读取要快,因为您正在从系统 RAM 读取,而不是从视频 RAM 读取。你可以阅读文章here。
【问题讨论】:
-
您是否考虑过使用replay system而不是以图形方式记录屏幕内容?
-
你不必挂任何东西。您只需编写输入事件,这样它们就不会直接控制游戏,而是调用其他函数。例如,如果玩家按下左键,您不会简单地减少玩家 x 的位置。相反,您调用一个函数,例如
MovePlayerLeft()。您还可以记录按键和其他输入的时间和持续时间。然后,当您处于播放模式时,您只需忽略输入,而是读取记录的数据。如果在数据中看到左键按下,则调用MovePlayerLeft()。 -
@PigBen 这将是一个用于录制游戏画面的通用应用程序。这不是针对特定游戏的。据我所知,有人按下左键可能意味着向右移动。此外,您还没有考虑不受用户影响的事件。 '那么渲染呢?
-
@someguy 好吧,我猜你正在做一些更激烈的事情,我已经使用上述方法添加了一个例程,以在 30fps 左右的游戏中顺利保存重播 AVI。我使用 Windows API 制作了一个多显示器屏幕录像机,用于“劳动力优化”,但即使在目标 4fps 下也表现不佳。
-
UltraVNC 的存储库站点上有一个用于 windows 的开源镜像驱动程序 ultravnc.svn.sourceforge.net/viewvc/ultravnc/…