GDI
注意Direct 3D部分,将有专门的文档介绍。
参考资料
- 官方资料:https://docs.microsoft.com/en-us/windows/win32/gdi/windows-gdi。
- <<windows图形编程>> 2002年出版。
概念
- 枚举窗口:获取窗口的信息。
几个模块的理解
/**
*@brief 在指定窗口中添加更新区域。
*@note1:无效区域(invalidated area)窗口的更新区域不断积累
(随着InvalidateXXX的调用),直到ValidateXXX调用或
下一个WM_PAINT发生。
*@note2:当前更新区域为非空,且应用程序消息队列中没有其他消息,
系统向相应的窗口发送WM_PAINT消息。
*/
BOOL InvalidateRect(
//指定窗口句柄。
[in] HWND hWnd,
//指定矩形区域。
[in] const RECT *lpRect,
//true:绘制前擦除更新区域的背景。
[in] BOOL bErase
);
/**
*@brief 将指定区域添加到更新区域。
其他和InvalidateRect相同。
*/
BOOL InvalidateRgn(
[in] HWND hWnd,
//所要添加区域的句柄
[in] HRGN hRgn,
[in] BOOL bErase
);
GDI+
https://docs.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-gdi-start。
GDI+和GDI
- 使用dumpbin分析。GDI+(gdiplus.dll)依赖GDI(gdi32.dll)。即GDI+是在基础上的封装。
DXGI
官方资料: https://docs.microsoft.com/zh-cn/windows/win32/direct3ddxgi/dx-graphics-dxgi。
IDXGIOutputDuplication接口函数
HRESULT AcquireNextFrame(
//最大等待时间间隔。
[in] UINT TimeoutInMilliseconds,
//当前帧时间和显示信息。
[out] DXGI_OUTDUPL_FRAME_INFO *pFrameInfo,
//包括桌面图像的结构体指针
[out] IDXGIResource **ppDesktopResource
)
- 只有桌面内容更新,或指针形状位置更新时,才能获取图像。(MSDN)。经过视博云-中间件-桌面采集实验,画面活动的越剧烈,一秒钟采集的图像越多。
- 如果超时,返回的ppDesktopResource为NULL,没有意义。
- 如果超时,新的桌面图像是无效的。
//表示应用程序已经完成帧的处理,释放资源。
HRESULT ReleaseFrame();
- 与AcquireNextFrame()配合使用。
- 当AcquireNextFrame(),没有必要调用ReleaseFrame()。因为根据实际测试,在这种情况下调用返回值为DXGI_ERROR_INVALID_CALL。
- 为了性能的问题,在调用AcquireNextFrame()之前调用ReleaseFrame,而且间隔时间尽可能的短。
IDXGIFactory1
EnumAdapters1
//枚举指定的显卡
HRESULT EnumAdapters1(
//指定显卡的索引。
UINT Adapter,
//输出的显卡接口指针。
//既可以是有输出的,也可以是没有输出的。
[out] IDXGIAdapter1 **ppAdapter
);
- 可以理解为,根据显卡序号,获取相应显卡的接口。
IDXGIOutput
WaitForVBlank()
//暂停线程,直到下一个垂直空白。当显示光栅从右下角移动到左上角以开始绘制下一帧时,会出现垂直空白。
HRESULT WaitForVBlank();
WaitForVBlank()用于等待Vsync显示模式被设置,具体详见https://docs.microsoft.com/en-us/previous-versions/windows/hardware/wlk/ff568863(v=vs.85)。屏幕采集必须在Vsync模式下进行,否则可能出现屏幕撕裂的现象。