问题标签 [managed-directx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1064 浏览

wpf - 使用 SharpDX 在 WPF 中滚动图像时出现生涩动画

我正在尝试在 WPF 应用程序中通过 SharpDX 使用 DirectX11 在窗口中平滑滚动一些图像。

一点背景:

图像是信号返回,随时间变化,已从文件加载并作为纹理数组加载到 D3D 中,图像本身被渲染为一系列带纹理的四边形(一系列相邻的矩形在一条很长的水平线上)。视口的设置使左右边缘代表时间偏移,并且在这些时间之间的时间段内显示信号。DirectX 的实现非常简单;四边形顶点生成一次,一个非常小的每帧缓冲区包含一个简单的 2D 世界视图变换,根据当前可见范围/缩放等更新比例和平移。据我所知,D3D 实现不是我遇到的问题的一部分-它确实是一个非常简单的设置,并且似乎渲染得非常快(应该如此),

问题:

为可见时间范围设置动画时,图像的滚动不流畅。图像在很多时候“抖动”,坦率地说看起来很糟糕(当它不抖动时,它看起来很棒)。

设置:

DirectX 被渲染为 D3DImage,在幕后进行了一些工作以使 DX11 工作 - 此代码取自https://sharpdxwpf.codeplex.com/

有多个 D3DImages(最多 4 个),排列在一个网格中(我一直在测试两个,两个都包含相同时间段的信号并且一起动画)。

这些 D3DImage 由 DrawingVisual(由自定义 FrameworkElement 托管)绘制,它们用作 ImageBrush 的源。frameworkelement 对象根据需要触发渲染,绘图视觉对象处理 D3D 渲染调用并绘制一个矩形以使用 D3DImage 画笔填充控件。

时间范围值使用 WPF DoubleAnimation 进行动画处理。当前显示的视觉效果通过 INotifyPropertyChanged 绑定到此值,并在每次更改时触发渲染(通过 InvalidateVisual)。

DrawingVisual 渲染代码,由“位置”值的变化触发(可见时间范围的开始):

我试过的:

我已经尝试了很多事情(并进行了很多搜索)来尝试确定问题是否是由于渲染请求时间抖动,或者问题是否进一步进入渲染过程。

  1. 挂钩 CompositionTarget.Rendering 首先通过 CompositionTarget.Rendering 驱动位置值的更新,并让其余过程保持原样(即元素对该值的变化作出反应):

(不用说,这是非常“测试”的代码):

结果 - 比简单的双重动画差。

  1. 使用 DispatcherTimer。与上面类似,使用计时器结合秒表来更好地判断经过的时间。更糟糕的结果再次出现,有趣的是 CPU 使用率从大约 7%(半个核心)下降到 0.7%。

最初的尝试以及变体 1 和 2 都尝试更新单个值,然后触发相关方的渲染。出于兴趣,我记录了渲染请求到达绘图视觉对象时的时间差异——尽管 DisptacherTimer 实际上在那里给出了最一致的结果(WPF 动画和 CompositionTarget 都丢弃了奇数帧),但 DisptacherTimer 也给出了最紧张的动画。

  1. 更新图像,但不使视觉无效。更新 ImageBrush 的源会更新显示的图像,而无需重新渲染 DrawingVisual。这种方法产生了非常紧张的结果。

  2. 框架元素本身中的 CompositionTarget.Rendering。这产生了该批次的最佳结果,但仍不完美。抖动会发生,然后消散,然后又回来了。在这种方法中,保存 DV 的框架元素与 CompositionTarget.Rendering 挂钩,并且视觉对象会查询当前位置,该位置正在独立进行动画处理。我几乎可以接受这种方法。

  3. 尝试等待直到渲染 D3D 场景,然后再使图像无效(没有明显的改进):

    _scene.Renderer.Render(_draw_args);
    _scene.Renderer.Device.ImmediateContext.End(q);

    while (!(_scene.Renderer.Device.ImmediateContext.IsDataAvailable(q))) Thread.Yield();

    _image.Invalidate();

观察:

  1. 我真的不认为这是一个性能问题。我的开发机器有一个很好的显卡,8 个 i7 内核等,这是一个简单的渲染操作。
  2. 这看起来确实像是 D3D 和 WPF 渲染之间的某种同步问题,但我不知道如何开始研究这个问题。
  3. 如果我有两个并行动画的图像,则抖动在两个图像中的第一个上更加明显(通常)。
  4. 如果我在制作动画时主动调整窗口大小,动画会非常流畅(尽管正在进行大量额外工作,因为 D3D 上下文正在不断调整大小)。

编辑

我已经尽可能地收回事情以尝试隔离问题,并且该问题似乎是 WPF 更新和呈现 D3DImage 的方式的基础。

我已经修改了 SharpDX Samples 解决方案中的 WPFHost 示例,以便显示的简单三角形在屏幕上显示动画。此示例托管在由 CompositionTarget.Rendering 上的 DPFCanvas 呈现的 DX10ImageSource 中。

这个例子再简单不过了,在 WPF 中渲染 D3DImage 时,它​​几乎是“接近金属”的。一个三角形,通过渲染之间的时间差计算的值在屏幕上平移。口吃仍然存在,来来去去,好像某种同步问题。它让我感到困惑,但本质上使 SharpDX 在 WPF 中无法用于任何类型的流畅动画,这非常令人失望。

如果有人有兴趣重现此问题,请在此处获得 SharpDX 示例:https ://github.com/sharpdx/SharpDX-Samples

我对 WPFHost 示例进行了以下简单更改:

在着色器 Simple.fx 中:

0 投票
1 回答
903 浏览

c#-4.0 - 如何使用 SlimDX.DirectSound 播放波形文件?

我是 SlimDX 的第一人。

我正在尝试播放波形文件。但它不起作用!

也许有什么不对??

使用 WinForms、SlimDX.DirectSound、SlimDX.Mutimemedia

0 投票
1 回答
39 浏览

directx - Directx 3D 较远的物体覆盖较近的物体

我是c#中DirectX的新手,有一个问题让我很困惑,基本上我想在屏幕上渲染两个立方体,一个离相机近,一个离相机远,这是我的预期是较近的总是在较远的前面,但实际上,它取决于渲染顺序,最后渲染的总是在另一个前面,我试图清除 z 缓冲区,但这不起作用全部,所以我想知道我做错了什么?

这是我的代码片段

0 投票
4 回答
3874 浏览

c++ - 在 DX 12 VC++ 中从图像创建纹理

我只想知道 Directx 12 API 从图像创建纹理。

对于 DX11,它是 D3DX11CreateShaderResourceViewFromFile,对于 DX9,它是 D3DXCreateTextureFromFileEx,对于 DX12?

0 投票
1 回答
619 浏览

c# - 替换托管 DirectX 的方法?

我的旧项目有一些问题......如果简短的话 - “使用 Microsoft.DirectX”。他们弃用了,现在,我在新 PC 上运行我的游戏并遇到了各种故障和麻烦,这在以前是不存在的。由于它们已弃用且不再受支持,因此我正在寻找替代 gfx 引擎而又不丢失所有应用程序代码的好方法的解决方案。例如,旧的 XNA 项目可以移植到 MonoGame 或 FNA,而无需对其架构进行一般更改,我需要以同样的方式进行。这里有任何接近通过 API 管理的 directX 的框架,而无需为移植它们带来很多痛苦吗?夏普DX?瘦身DX?任何其他?(我之前没有使用 SharpDX 或 SlimDX 的经验)

这里有一些关于我的 GFX 代码的片段,只是为了想象它是怎样的。它们基于托管 DirectX。

0 投票
0 回答
500 浏览

c# - 在我的项目中使用 Microsoft.DirectX.AudioVideoPlayback.dll 时,我得到 Managed Debugging Assistant 'LoaderLock' has detected a error

我的 form1 设计器中有一个菜单条。在表格 1 的顶部:

视频是 Microsoft.Directx.AudioVideoPlayBack.Video

然后在 menustrip 打开菜单点击事件:

尝试在线打开视频文件时出现错误/异常:

这是我得到的错误异常,我试图用谷歌搜索,但我还不明白我应该怎么做才能修复它,而且我没有在我的项目中使用 Microsoft 目录中的 Microsoft.DirectX.dll:

托管调试助手“LoaderLock”在“C:\Users\bout0_000\Documents\Visual Studio 2013\Projects\DateCounter\DateCounter\bin\Debug\Battlefield1_ReleaseDateCounter.vshost.exe”中检测到问题。

附加信息:DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' 正在尝试在 OS Loader 锁定内进行托管执行。不要尝试在 DllMain 或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。

如果有这个异常的处理程序,程序可以安全地继续。

0 投票
1 回答
1437 浏览

c# - 画圆 C# Directx

我正在尝试使用托管 DirectX 在 C# 中绘制一个二维圆。(是的,它已过时,不受支持,我知道)

我在网上能找到的每一个例子都是用 C++ 编写的。他们使用 D3DTLVERTEX 之类的东西,我的 C# 库似乎没有。我不知道如何将 Directx C++ 转换为 Directx C#,因为它们在语法上似乎非常不同。

我正在使用这个简单的方法在 C# 中绘制一个矩形

我一次又一次地尝试画一个圆圈,但没有成功。如果圆圈被填充或只是圆圈轮廓,对我来说并不重要。谢谢。

0 投票
0 回答
116 浏览

c# - C# MDX 设备。表单最小化重置失败

我正在使用托管 DirectX/C#/WinForms 进行一些图形和视频渲染。

我正在使用自己的 SwapChain 并设置 Device.IsUsingEventHandlers = true,否则不会调用我的 for OnDeviceLost 和 OnDeviceReset 事件处理程序(为什么?)

因此,当用户单击以最小化表单时,我收到了对 OnResize() 的调用,我将其覆盖。this.ClientSize 是 (0, 0) 最小化。

在 OnResize() 调用中,我设置标志以跳过 Draw() 函数。

我得到 OnDeviceLost 事件处理程序调用,我在其中释放资源。

之后,代码在“自动/隐式” device.Reset() 调用上崩溃,通常会调用 OnDeviceReset() 甚至是我为我的设备设置的处理程序。

我无法找到应该如何处理这个最小化事件以避免隐式 device.Reset() 上的崩溃。需要帮助,请。

我是否需要在最小化时处理设备并销毁 DirectShow 图形(我并不总是渲染视频)?或者是否有处理最小化事件的标准方法?即使我不创建 DirectShow 图形,代码也会崩溃,只是在这里和那里渲染几行,没有视频,所以崩溃似乎与 DirectShow 无关。

崩溃调用堆栈如下所示: 应用程序中的错误。

0 投票
1 回答
237 浏览

directx - 使用 directx9 或 DX11 实现区域光

我想使用 Directx 9 实现 AreaLight 请帮助我了解如何开始。我研究了两个三个链接,但可以在 RenderMonkey 或 Direct With Sample 中实现

0 投票
0 回答
125 浏览

directx - 使用 In 的矩形区域光

我想像下面的链接 http://blog.selfshadow.com/sandbox/ltc.html使用 directx-9 来实现 Area Light Exact 我应该如何开始。