在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

2024-05-04

我用c++编写了一个DX11渲染器。我现在正在寻找一种方法来实现它的编辑器/GUI。

由于我非常习惯 Windows 窗体和 WPF C# 应用程序,因此我正在考虑将渲染器放入 dll 中,从 C# 应用程序加载 dll,并使用它绘制到表单的定义部分。这是否适用于托管 C# 应用程序传递的窗口句柄?如果适用,性能如何?

根据我的理解,由于与 DX11 API 的实际通信仍然直接在 c++ 中进行,而 c# 部分只会告诉 dll 做什么,因此性能损失应该几乎没有。或者这通常是一个坏主意,使用库或 D2D 直接在 C++ 中实现 GUI 是更好的方法。


在WPF中你可以使用D3DImage https://learn.microsoft.com/en-us/dotnet/api/system.windows.interop.d3dimage?view=netframework-4.7.2这就像 xaml 中的简单图像一样。总体原理如下:

  • 分配 Direct3D 9 纹理,这将是您的渲染目标。
  • 将其交给D3DImage.SetBackBuffer。
  • 将渲染代码放入 CompositionTarget.Rendering 事件处理程序中。

        RenderStuffToTexture();
        d3dImage.Lock();
        d3dImage.AddDirtyRect(new Int32Rect()
        {
            X = 0,
            Y = 0,
            Height = d3dImage.PixelHeight,
            Width = d3dImage.PixelWidth
        });
        d3dImage.Unlock();
    

由于您使用的是 Direct3D 11,因此必须使用DXGI 表面共享 https://learn.microsoft.com/en-us/windows/desktop/direct3darticles/surface-sharing-between-windows-graphics-apis与 D3D11 共享 D3D9 纹理。我知道有两个例子可以说明如何做到这一点。微软D3D11图像 https://github.com/Microsoft/WPFDXInterop和D3DImageEx(我个人的喜好,可以在网上多个地方找到)。

关于性能,一旦使用 WPF,您就不再需要自己进行演示了。您实际上是在基于 WPF D3D9 的渲染器中编写了一个小的渲染到纹理逻辑。所以并不是所有事情都可以控制,包括演示时间。根据我的个人经验,您绝对可以以良好的帧速率渲染简单的场景。对于真正的图形密集型应用程序和严格的 FPS 要求,我会使用更轻量级(且侵入性较小)的 UI 解决方案。

请注意,您还可以使用 WinformHost 控件来获取 HWND 并呈现给它。如果您想在渲染帧上覆盖 UI 控件,这会带来严重的缺点 - 据我所知,您根本做不到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL 的相关文章

  • MongoDB C# 驱动程序检查身份验证状态和角色

    这是我使用 MongoDB 身份验证机制登录 MongoDB 的代码 try var credential MongoCredential CreateMongoCRCredential test admin 123456 var sett
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何向 UWP 项目添加 .NET dll 引用?

    我有几个适用于 NETv4 x 的 NET dll 项目 我将版本更改为 4 6 1 并重新构建 没有出现问题 当我尝试从 UWP 项目向它们添加引用时 出现错误 项目的目标是 NETCore 而文件引用的目标是 NET框架 这不是受支持的
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • 如何在不使用reinterpret_cast的情况下使用dlsym()加载函数?

    我正在尝试使用 clang tidy 来强制执行 C 核心指南 虽然它确实有很多有效点 但有一件事我无法真正解决 dlsym 返回一个void 我需要以某种方式将其转换为正确的函数指针 为此 我使用reinterpret cast 由于指南
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 使用 Linq 进行异步Where过滤

    我有一个List通过填充的元素async调用 WebService 没问题 我需要过滤该列表以便在应用程序视图上显示某些内容 我试过这个 List
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • C++0x 中的新 unicode 字符

    我正在构建一个 API 它允许我获取各种编码的字符串 包括 utf8 utf16 utf32 和 wchar t 根据操作系统 可能是 utf32 或 utf16 新的 C 标准引入了新类型char16 t and char32 t没有这么

随机推荐

  • 在Spark的客户端模式下,驱动程序需要网络访问远程执行程序?

    使用火花时在客户端模式 例如yarn client 运行驱动程序的本地计算机是否直接与运行远程执行程序的集群工作节点通信 如果是 是否意味着机器 运行驱动程序 需要具有对工作节点的网络访问权限 那么master节点向集群请求资源 并将wor
  • H2 中的 IF 函数用于 MySQL 兼容性

    我正在使用 H2 具有 MySQL 兼容模式 针对我们使用 MySQL 的软件编写一些自动化测试 不幸的是 H2 似乎没有IF我们的许多查询都使用该函数 除了使用 DECODE 之类的东西重写我们的应用程序查询之外 它们是创建 if 函数
  • Google Places API 上的寻呼返回状态 INVALID_REQUEST

    我正在使用 Google Place API 进行地点搜索 https developers google com places documentation search https developers google com places
  • 实体框架不查询派生类 - DbOfTypeExpression 中的错误

    我有一个基类和两个派生类 每个派生类都实现相同的类型作为属性 唯一的区别是属性名称 遗憾的是我对类设计没有太大影响 gt 它们是从 wsdl 文件生成的 然后我在 BaseType 上有一个属性来封装公共属性 计划是在我的网络视图等中使用此
  • 如何在 Angular 6 中过滤复杂结构化的 Json 数据

    我有一个复杂的结构化 json 数据 需要在我的 Angular 6 应用程序中应用高级过滤 JSON 数据 StudentId 1 StudentName Student1 Sex M Programs StudentId 1 Progr
  • 将 ActiveX Com 组件与 Node.js 一起使用。是否可以

    有没有办法将任何ActiveX com组件与nodejs一起使用 实际上 我永远不需要这个 但我在 Windows 上运行 nodejs 并尝试发送 ping 请求而不分叉新进程 Windows 不存在这样的模块 由于存在一些 Active
  • 从命令行将绑定或参数传递给 ERB

    我最近一直在从命令行使用 erb 我想制作一个非常简单的 erb 模板 例如以下内容 Hello My name is I hope your day is 如果我跑的话这有效 erb T thatfile erb 我想做的是name an
  • 每次更改工作表时运行宏

    我对宏还很陌生 每次更新 更改或其他任何操作时 我都需要在工作表上运行一些代码 这是我需要运行的代码 我怎样才能做到这一点 Sub UnMergeFill Dim cell As Range joinedCells As Range For
  • 分割具有最大字符数限制的字符串

    我试图将一个字符串拆分为许多字符串 列表 每个字符串都有最大字符数限制 假设我有一个 500 个字符的字符串 并且我希望每个字符串最多有 75 个字符 那么就会有 7 个字符串 而最后一个字符串不会有完整的 75 个字符 我尝试了在 sta
  • 如何处理 UICollectionView CompositionalLayout 中的空项目部分

    我正在尝试使用具有多个部分的组合布局制作集合视图 但如果部分中有空项目我该如何处理 如果项目为空 我不想显示该部分 UICollectionViewCompositionalLayout section env gt NSCollectio
  • 获取字典中相似值的键的最有效方法

    我有一个对象字典 I have thousands of objects in my real world scenario dic k1 obj1 k2 obj2 k3 obj3 keys are string objs are MyOb
  • 带有输出文件和屏幕输出的 sqlcmd

    我使用 sqlcmd 执行一些命令行批处理 bat 如下所示 sqlcmd i Scripts STEP01 sql o PROCESS log S MYSERVER E d MYDATABASE 我需要一个输出文件 当前有效 以及通过屏幕
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的
  • 我们可以从视图调用控制器的方法(理想情况下我们从助手调用)吗?

    在 Rails MVC 中 您可以从视图调用控制器的方法 因为方法可以从助手调用 如果是 怎么办 答案如下 class MyController lt ApplicationController def my method Lots of
  • 许可证密钥模式检测? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这不是真实情况 请忽略您可能认为适用的法律问题 因为它们并不适用 假设我有一组 200 个已知的有效许可证密钥 用于假设的软件许可算法
  • PyGTK+3(PyGObject)创建屏幕截图?

    我过去 3 天在 google 上搜索 如何使用 PyGTK 3 创建屏幕截图 有关于 pyqt pygtk 2 wx 和 PIL 的 gallizion 教程 顺便说一句 我不需要 scrot imlib2 imagemagick 等外部
  • 使 C# 源代码作为脚本运行?

    我正在编写一些脚本 我发现有时更多的功能会更好 就像持续尝试以 1 秒延迟删除文件并使其可移植的能力一样 我今天花了一些时间将 bat 脚本翻译为 bash 我知道我可以使用 php 或 python 但我非常喜欢静态 编译时间检查 有没有
  • 有可能吗?:行为 t [行为 t a] -> 行为 t [a]

    有没有办法有一个Behavior t a 其中 a 在时间 t 的值是 a 中包含的值Behavior t Behavior t a 在时间 t 即 具有以下类型的函数 Behavior t Behavior t a gt Behavior
  • 两种 SQL 连接符号有什么区别?

    SQL 1 select from t1 join t2 on t1 f1 t2 f2 SQL 2 select from t1 t2 where t1 f1 t2 f2 他们返回的结果是相同的 它们之间有什么区别吗 例如 DBMS 如何运
  • 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

    我用c 编写了一个DX11渲染器 我现在正在寻找一种方法来实现它的编辑器 GUI 由于我非常习惯 Windows 窗体和 WPF C 应用程序 因此我正在考虑将渲染器放入 dll 中 从 C 应用程序加载 dll 并使用它绘制到表单的定义部