使用 D2D 绘制界面以及使用 AOT 发布的应用

💡 原文中文,约20400字,阅读约需49分钟。
📝

内容提要

本文介绍了使用不到370行代码从零开始创建Win32窗口并绘制界面内容的过程,同时分享了使用AOT方式发布测试应用的方法和代码的下载方法。

🔎

延伸解读

AOT 发布时的裁剪陷阱与修复

文章指出,使用 AOT 发布时,Vortice 库中的类型可能因裁剪而丢失,导致运行时出现 MissingMethodException。解决方法是将这些程序集添加到 TrimmerRootAssembly 中,防止被裁剪。这提醒开发者在 AOT 环境下需特别注意反射和动态类型的使用,必要时保留根程序集。

资源占用与性能表现

作者实测应用发布后文件大小不超过 10MB,任务管理器显示内存约 30MB,VMMap 查看 WorkingSet 和 Private Bytes 均在 60MB 以内。虽然 Committed 内存高达 300MB,但大部分为共享的 Image 部分(如显卡驱动),实际私有占用不到 10MB。这表明该方案在资源受限环境下具有优势。

代码组织与实现思路

所有代码集中在 Program.cs 中,不到 370 行,且主要逻辑位于 Main 方法及其局部方法内。通过 DrawingInfo 结构体存储圆形信息,并在循环中更新坐标实现动画。这种紧凑的结构适合快速原型开发,但也可能影响代码的可维护性和扩展性。

适用场景与潜在价值

作者认为该技术可用于制作小而美的工具,尤其是仅需考虑 x64 的安装包制作程序。使用 D2D 绘制界面可以提升安装包的视觉体验,可能推动安装包行业的界面创新。但文章未涉及跨平台或 x86 支持,开发者需根据实际需求评估。

❓

Q&A

如何用不到370行代码创建一个Win32窗口并用D2D绘制界面?

使用.NET 8框架,通过Vortice库封装DirectX,在Program.cs中编写所有代码。先创建Win32窗口,然后初始化D3D11设备和交换链,再创建D2D设备上下文,将DXGI表面作为渲染目标,最后在循环中绘制圆形并呈现。

使用AOT发布这个D2D应用时遇到类型丢失错误怎么办?

错误提示如'No parameterless constructor defined for type 'Vortice.DXGI.IDXGIFactory2'',这是因为AOT裁剪掉了Vortice库中的类型。解决方法是在csproj中添加TrimmerRootAssembly项,将Vortice相关程序集(如Vortice.Win32、Vortice.DXGI等)包含进来,防止被裁剪。

这个D2D应用发布后的文件大小和内存占用如何?

发布后的AOT文件大小不超过10MB,运行内存稳定在60MB以内(WorkingSet和Private Bytes),任务管理器显示约30MB。虽然Committed内存可能高达300MB,但大部分是共享的Image占用,实际私有部分不到10MB。

如何让D2D绘制的圆形动起来?

使用DrawingInfo结构体存储每个圆形的坐标、大小和画刷。在绘制循环中,每次修改Offset值,让圆形在其附近随机移动,并确保坐标在窗口范围内。然后调用FillEllipse绘制每个圆形。

这个D2D AOT应用使用了哪些主要的库?

使用了Vortice系列库(包括Vortice.Direct2D1、Vortice.Direct3D11、Vortice.DXGI等)封装DirectX,以及Microsoft.Windows.CsWin32用于调用Win32 API。

如何获取这个D2D AOT应用的源代码?

可以通过git从gitee或github获取。先创建空文件夹,进入后执行git init,然后添加远程仓库(gitee: https://gitee.com/lindexi/lindexi_gd.git 或 github: https://github.com/lindexi/lindexi_gd.git),最后git pull origin 66f9fe05baba8ad30495069aebd447b160484215。代码在CedageawhakairnerewhalNaibiferenagifee文件夹中。

这个技术适合用来做什么?

可以用来制作小而美的工具,特别是只考虑x64机器的应用安装包制作程序。使用D2D绘制的界面作为安装包界面,可以提升安装包行业的界面体验。

🏷️

标签

➡️

继续阅读