如何将dotnet Vortice与DirectComposition对接渲染层实现无交换链渲染?

摘要:在传统的写法里面,都是面向于 DXGI 交换链实现界面渲染。在 DirectComposition 里面可以通过 IDCompositionDevice 的 Commit 和 WaitForCommitCompletion 方法配置将窗口内
在 DirectComposition 里面提供了 Commit 机制,一次 Commit 的所有内容都能在相同的一帧在屏幕显示出来,如此可以非常方便地完成渲染对齐任务 通过 WaitForCommitCompletion 方法可以等待 Commit 内容完成渲染,此方法作用相当于等待交换链写法的等待垂直同步实现 在 上一篇博客 中,采用了传统的 DXGI 交换链与 DirectComposition 对接 在本文这里将去掉交换链,可以很大简化对接渲染的逻辑。采用 DXGI 交换链对接的方式,可以比较方便对接原有的程序,且可以实现更高帧率的控制。而采用 DirectComposition 的 Commit 写法,可以更好利用 DirectComposition 机制,实现多表面合成以及更加实时的合成器动画 本文将给出最简实现对接的代码逻辑,其步骤如下 创建 Win32 窗口 创建 DirectComposition 设备和关联窗口,获取渲染表面 执行渲染逻辑 为了保持本文简洁,我将不在正文部分贴出非关键部分的代码,在本文末尾给出全部核心代码。本文的全部核心代码部分不到 200 行,适合一口气完成。本文也使用了到了一些库,为了防止大家不知道项目如何配置的,在本文末尾也给出整个项目全部代码和配置的下载方法 基础库 按照 .NET 的惯例,开始之前先安装基础库,安装之后的 csproj 项目文件代码大概如下 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net10.0</TargetFramework> <Nullable>enable</Nullable> <IsAotCompatible>true</IsAotCompatible> <PublishAot>true</PublishAot> </PropertyGroup> <ItemGroup> <PackageReference Include="Vortice.Direct2D1" Version="3.8.2" /> <PackageReference Include="Vortice.Direct3D11" Version="3.8.2" /> <PackageReference Include="Vortice.DirectComposition" Version="3.8.2" /> <PackageReference Include="Vortice.DXGI" Version="3.8.2" /> <PackageReference Include="Vortice.Win32" Version="2.3.0" /> <PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.257"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference> <PackageReference Include="MicroCom.Runtime" Version="0.11.0" /> </ItemGroup> </Project> 创建 Win32 窗口 创建 Win32 窗口仅仅只是想拿到窗口句柄,不是本文重点,这里就忽略 CreateWindow 方法的实现 // 创建窗口 HWND window = CreateWindow(); // 显示窗口 ShowWindow(window, SHOW_WINDOW_CMD.SW_NORMAL); 以上代码的 ShowWindow 是标准的 Win32 方法,由 CsWin32 库生成。
阅读全文