本文告诉大家我在测试 WPFMediaKit 的 D3D 配置性能影响在 4k 分辨率设备下采用高清摄像头的性能
测试效果是 10 代 i3 带 4G 内存和集显 UHD 630 在 4k 下,跑满 36 Hz 不卡。以下是具体测试的逻辑
在 WPFMediaKit 定义渲染在 Vmr9Allocator 类里面,在 CreateDevice 方法上采用如下代码进行初始化 IDirect3DDevice9 设备
在 InitializeDevice 使用如下代码初始化
通过如上代码创建的 IDirect3DSurface9 类型的 m_privateSurface
可以作为 D3DImage 的使用参数
为了测试此方式的参数创建的 IDirect3DTexture9 在 WPF 里的性能,本文将扔掉摄像头部分,换 D2D 渲染,测试在 4k 的性能。因为加上摄像头还有解码部分的逻辑,这部分逻辑将让说明性能失败
创建一个空 WPF 应用,在 MainWindow_Loaded 添加初始化代码
使用 Direct3DCreate9Ex 函数创建 IDirect3D9Ex 对象
所使用的参数如下
拷贝 Vmr9Allocator 的代码初始化,但是需要修改部分逻辑,如删掉 BackBufferFormat 的设置和更改 SwapEffect 的参数,加上 hDeviceWindow 和 PresentationInterval 定义
和 Vmr9Allocator 使用相同代码创建设备
为了在 D3D9 里使用上 D2D 需要创建 D3D11 设备,这部分逻辑只是用来测试,为了方便代码,我加上 SharpDx 的引用。值得一说的是 SharpDx 当前官方不维护了,可以选择的代替请看 SharpDx 的代替项目
参考 WPF 使用 SharpDX 在 D3DImage 显示 的定义逻辑,在 CreateRenderTarget 方法加上代码
调用 CreateRenderTarget 可以拿到 D3D11.Texture2D 对象,可以使用此作为 SharedHandle 创建 IDirect3DTexture9 对象
上面代码的 TranslateFormat 如下
拿到 m_privateTexture 对象,即可使用 GetSurfaceLevel 方法获取到可以给 D3DImage 的 BackBuffer 的参数
以上就完成了初始化逻辑,参数和 WPFMediaKit 相同,接下来是通过 D2D 进行渲染
以上就是测试 WPFMediaKit 的代码
本文所有代码放在github 和 gitee 欢迎访问
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
获取代码之后,进入 NaferfairqeLidajekawnal 文件夹
测试效果如下:
测试机器配置如下
- CPU i3 10100
- 内存 4G 2667MHz
- GPU Intel(R) UHD Graphics 630
系统版本是 19041.1348 版本
运行效果为最大化窗口 4k 分辨率,刷新率 36 左右下跑满 GPU 但不卡。其中 GPU 有百分之20是 DWM 占用
更多 DX 相关请看 WPF 使用 SharpDx 渲染博客导航
Direct3D 9Ex improvements - Win32 apps
Surface sharing between Windows graphics APIs - Win32 apps
IDirect3DSurface9 (d3d9helper.h) - Win32 apps
IDirect3DSurface9::LockRect (d3d9helper.h) - Win32 apps
IDirect3DSurface9::GetDC (d3d9helper.h) - Win32 apps
SuppressUnmanagedCodeSecurityAttribute 类 (System.Security)
c# - SharpDX. Unsupported pixel format - Stack Overflow
原文链接: http://blog.lindexi.com/post/WPF-%E6%A8%A1%E6%8B%9F-WPFMediaKit-%E7%9A%84-D3D-%E9%85%8D%E7%BD%AE%E7%94%A8%E6%9D%A5%E6%B5%8B%E8%AF%954k%E6%80%A7%E8%83%BD
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。