ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

D3DPRESENT_PARAMETERS 参数详解

2026/8/3 8:07:10 拓冰建站 浏览量
D3DPRESENT_PARAMETERS 参数详解 D3DPRESENT_PARAMETERS是 D3D9 里交给CreateDevice/CreateAdditionalSwapChain/Reset的“交换链契约”它描述“后台缓冲多大、什么格式、怎么翻到前台、绑哪个窗口”。下面按字段逐条说并标出和你前面 DXVA2 / 默认交换链场景相关的注意点。结构体原型typedef struct D3DPRESENT_PARAMETERS { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; } D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;使用前必须ZeroMemory因为它是in/outD3D 可能回写0 尺寸变客户区尺寸、D3DFMT_UNKNOWN变桌面格式。逐字段详解BackBufferWidth / BackBufferHeight后台缓冲像素尺寸。窗口模式填 0 → 自动取hDeviceWindow客户区大小或hFocusWindow若hDeviceWindowNULL。全屏模式必须填EnumAdapterModes里存在的分辨率否则CreateDevice/Reset直接D3DERR_INVALIDCALL。DXVA2 视频场景窗口模式一般填 0WM_SIZE 后选择Reset或依赖 Present 自动适配全屏才显式填 1920×1080 之类。BackBufferFormat颜色格式如D3DFMT_X8R8G8B8、D3DFMT_A8R8G8B8。窗口模式可填D3DFMT_UNKNOWN运行时用当前桌面格式最省事。全屏模式必须CheckDeviceType校验过通常用GetAdapterDisplayMode().Format。视频渲染注意后台缓冲是 RGB 格式DXVA2 解码 surface 是 NV12靠StretchRect做色彩空间转换不需要后台缓冲是 YUV。BackBufferCount后台缓冲数量0 视作 1一般填 1。D3DSWAPEFFECT_FLIP可用 1D3DSWAPEFFECT_COPY严格要求 1。视频/UI 场景1 个足够。MultiSampleType / MultiSampleQualityMSAA 抗锯齿。必须D3DMULTISAMPLE_NONE除非SwapEffectD3DSWAPEFFECT_DISCARD。质量等级由CheckDeviceMultiSampleType查超范围 →D3DERR_INVALIDCALL。视频播放不要开 MSAA浪费带宽且和StretchRect缩放无关。SwapEffect前后缓冲切换语义三选一D3DSWAPEFFECT_DISCARD首选性能最好Present 后后台内容未定义你本来每帧重画。D3DSWAPEFFECT_FLIP保留后台内容全屏翻页式老式双缓冲。D3DSWAPEFFECT_COPY拷贝到前台必须BackBufferCount1延迟高。视频/游戏几乎永远DISCARD。hDeviceWindow实际 Present 到哪个窗口。WindowedTRUE可 NULL回退到hFocusWindow但通常显式填播放窗口 hwnd。WindowedFALSE必须是顶层窗口且多显示器时每个全屏设备要不同 device window。注意D3D不会自动监听这个窗口的 WM_SIZE 去隐式 Reset 后台缓冲窗口 resize 你要自己Reset或接受裁剪。WindowedTRUE窗口模式FALSE全屏。全屏时hFocusWindow必须是顶层窗口且FullScreen_RefreshRateInHz不能为 0。EnableAutoDepthStencil是否让 D3D 自动建深度/模板缓冲。3D 场景TRUE。纯 DXVA2 视频 StretchRect 可选 2D UIFALSE不需要深度测试省显存。若 TRUEAutoDepthStencilFormat必须填合法值如D3DFMT_D24S8/D3DFMT_D16否则失败。AutoDepthStencilFormatEnableAutoDepthStencilTRUE时生效D3DFMT_D1616 位深度D3DFMT_D24S824 深度 8 模板D3DFMT_D24X824 深度无模板视频场景不填或随便填都行因为不开。FlagsD3DPRESENTFLAG_*组合常用0大多数情况D3DPRESENTFLAG_LOCKABLE_BACKBUFFER后台可 Lock性能降调试用D3DPRESENTFLAG_DISCARD_DEPTHSTENCILPresent 后丢弃深度模板省事D3DPRESENTFLAG_VIDEO/D3DPRESENTFLAG_DEVICECLIP视频专用交换链可加9Ex 更明显FullScreen_RefreshRateInHz窗口模式必须 0全屏模式EnumAdapterModes里的刷新率或D3DPRESENT_RATE_DEFAULT填显示器不支持的值会被夹到最近支持值但建议别乱填。PresentationInterval后台→前台最大呈现频率垂直同步控制D3DPRESENT_INTERVAL_DEFAULT等 VBlank窗口模式默认且最稳D3DPRESENT_INTERVAL_ONE每 VBlank 最多 1 帧D3DPRESENT_INTERVAL_IMMEDIATE不锁 VSync延迟最低但可能撕裂游戏/低延迟视频可选D3DPRESENT_INTERVAL_TWO/THREE/FOUR每 N 个 VBlank 呈现一次视频播放默认INTERVAL_DEFAULT或ONE即可。两套典型填写窗口模式 DXVA2 视频 默认交换链D3DPRESENT_PARAMETERS pp{}; pp.Windowed TRUE; pp.BackBufferWidth 0; // 跟随窗口客户区 pp.BackBufferHeight 0; pp.BackBufferFormat D3DFMT_UNKNOWN; pp.BackBufferCount 1; pp.MultiSampleType D3DMULTISAMPLE_NONE; pp.SwapEffect D3DSWAPEFFECT_DISCARD; pp.hDeviceWindow hwnd; pp.EnableAutoDepthStencil FALSE; pp.Flags 0; pp.FullScreen_RefreshRateInHz 0; pp.PresentationInterval D3DPRESENT_INTERVAL_DEFAULT;全屏 1080p 播放pp.Windowed FALSE; pp.BackBufferWidth 1920; pp.BackBufferHeight 1080; pp.BackBufferFormat d3ddm.Format; // 从 GetAdapterDisplayMode 拿 pp.SwapEffect D3DSWAPEFFECT_DISCARD; pp.hDeviceWindow hwnd; pp.FullScreen_RefreshRateInHz D3DPRESENT_RATE_DEFAULT; pp.PresentationInterval D3DPRESENT_INTERVAL_ONE;和 Reset / 窗口缩放的关系窗口模式BackBufferWidth/Height0创建后D3D 在 Present 时会按hDeviceWindow当前位置/尺寸走但后台缓冲实际像素尺寸不会自动变要真正改后台尺寸就得Reset(pp)WM_SIZE 里做。Reset时必须保证全屏分辨率在EnumAdapterModes内、窗口模式 hwnd 有效、BehaviorFlags 和原设备一致、所有 D3DPOOL_DEFAULT 资源先释放。DXVA2 decoder 绑在IDirect3DDevice9上Reset会让设备丢失解码器 surface 也要按IDirect3DDeviceManager9::ResetDevice流程重绑。