标签: direct3d10

OpenGL/D3D:如何在Windows中全屏运行游戏的屏幕抓取?

假设我有一个全屏运行的OpenGL游戏(Left 4 Dead 2).我想以编程方式获取它的屏幕抓取然后将其写入视频文件.

我尝试过GDI,D3D和OpenGL方法(例如glReadPixels),并在捕获流中接收空白屏幕或闪烁.

有任何想法吗?

对于它的价值,一个类似于我想要实现的东西的典型例子是Fraps.

opengl screen-scraping direct3d10

11
推荐指数
2
解决办法
5032
查看次数

在禁用DWM的窗口模式下Direct3D 10 vsync问题

我在禁用DWM的窗口模式下在Direct3D 10上遇到vsync问题.

我们有一个应用程序,它呈现并呈现一些输出.它必须在窗口模式下工作,它必须至少产生稳定的60 fps.一个版本的应用程序使用Direct3D 9和另一个Direct3D 10.当我们在窗口模式下工作时,有时我们有fps减少(它不是"稳定"减少.大多数时候我们产生稳定的60 fps,有时它会突然减少几秒钟,然后回到60帧/秒).在两个版本的应用程序中,fps减少约为10-20 fps.这是不可接受的.

在Windows Vista和Windows 7中,有一种新的图形系统,称为"桌面组合",它改变了应用程序在屏幕上显示像素的方式.桌面组合由桌面窗口管理器(DWM)执行.您知道,当启用DWM时,应用程序将绘制到视频内存中的屏幕外表面,而不是由DWM呈现并在一段时间内显示在显示屏上.所以,我们注意到,当任务管理器中的dwm.exe没有做任何事情(处理时间约为0%)时,我们有fps减少,当dwm.exe需要1-3%的处理时间时,有稳定的60 fps,所有都是好.

我们无法影响它.因此,我们必须关闭DWM才能获得高稳定的fps.当我们关闭它时,一切都好.两个版本的应用程序都有稳定的60 fps.但是DWM在窗口模式下执行vsync,所以当我们关闭它时,我们必须自己做vsync.

但是当我们关闭DWM时,在窗口模式下Direct3D 10中的vsync存在问题.在显示器顶部有图像撕裂.Direc3D 9运行良好.

因此,我们有一个60 Hz刷新率的显示器.

在创建交换链时,我们设置了这样的参数:

swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
Run Code Online (Sandbox Code Playgroud)

在演示时我们设置了一个标志来打开vsync:

m_pSwapChain->Present( 1, 0 );
Run Code Online (Sandbox Code Playgroud)

并有下一个vsync问题.有垂直线,从左到右快速移动.并且在显示器的顶部有图像撕裂.
http://bit.ly/POQoFq

起初我们认为,我们做错了什么.所以我用旋转立方体安装了Microsoft的示例"Tutorial 07:Texture Mapping and Constant Buffers".制作更大的立方体,将其放置得更高,使其旋转得更快并得到同样的问题(见图片).
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu

所以,在全屏模式下的Direct3D 10上一切都还可以.Vsync工作得很好.在Direct3D 9上也可以,在禁用或启用DWM的情况下,vsync工作正常.在禁用DWM的窗口模式下的Direct3D 10上存在问题.

它在不同的计算机,不同的视频卡(Nvidia 8600 GT,Nvidia 9500 GT,ATI Radeon HD 5870 Eyefinity 6)和不同版本的驱动程序上进行了测试.问题稳定转载.我们正在使用Windows 7.

那么,为什么会出现这样的问题呢?如何解决它以及接下来该做什么?

UPD1.如果上面的图像不可用,则会有一些镜像.

https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313. JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG

UDP2.我还要注意,我正在使用标志WS_POPUP创建窗口以隐藏标题栏(必须隐藏它).图像撕裂出现在不同的地方.它始终位于屏幕的顶部,但它可以是20像素,并且可以是50像素.因此,在创建带有标题栏的窗口时,图像的顶部有时可能根本看不到图像撕裂.

directx dwm vsync direct3d10 directx-10

5
推荐指数
0
解决办法
1978
查看次数

检测 Ref-counted COM 对象上的内存泄漏(Addref without Release)

我正在编写一个 Direct3D 10 应用程序,并希望确保没有 COM 对象泄漏。

是的,我用 CComPtr 包装接口,但无论如何我都想进行泄漏检查,出于同样的原因,我仍然使用普通的堆分配泄漏检测器,即使 RAII 和智能指针保证不会泄漏:有时(特别是在接口时)对于像 Direct3D 这样的 C 库),您必须回退到较低的抽象级别并使用原始指针、new、delete,并且您会犯错误。(更不用说某些对 Release() 的调用在程序结束时不会返回 0)

在包含 atlbase.h 之前,我已经#define _ATL_DEBUG_INTERFACES,但输出窗口中没有出现任何内容!我还需要做些什么才能让 _ATL_DEBUG_INTERFACES 正常工作吗?

com directx atl smart-pointers direct3d10

5
推荐指数
1
解决办法
4132
查看次数

direct3D 10&11

direct3d sdk 10和11之间是否存在很大差异(编码方式......),就像direct3d 9和10之间的"它"一样?

谢谢

directx direct3d direct3d10

3
推荐指数
1
解决办法
295
查看次数