问题标签 [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.
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 渲染代码,由“位置”值的变化触发(可见时间范围的开始):
我试过的:
我已经尝试了很多事情(并进行了很多搜索)来尝试确定问题是否是由于渲染请求时间抖动,或者问题是否进一步进入渲染过程。
- 挂钩 CompositionTarget.Rendering 首先通过 CompositionTarget.Rendering 驱动位置值的更新,并让其余过程保持原样(即元素对该值的变化作出反应):
(不用说,这是非常“测试”的代码):
结果 - 比简单的双重动画差。
- 使用 DispatcherTimer。与上面类似,使用计时器结合秒表来更好地判断经过的时间。更糟糕的结果再次出现,有趣的是 CPU 使用率从大约 7%(半个核心)下降到 0.7%。
最初的尝试以及变体 1 和 2 都尝试更新单个值,然后触发相关方的渲染。出于兴趣,我记录了渲染请求到达绘图视觉对象时的时间差异——尽管 DisptacherTimer 实际上在那里给出了最一致的结果(WPF 动画和 CompositionTarget 都丢弃了奇数帧),但 DisptacherTimer 也给出了最紧张的动画。
更新图像,但不使视觉无效。更新 ImageBrush 的源会更新显示的图像,而无需重新渲染 DrawingVisual。这种方法产生了非常紧张的结果。
框架元素本身中的 CompositionTarget.Rendering。这产生了该批次的最佳结果,但仍不完美。抖动会发生,然后消散,然后又回来了。在这种方法中,保存 DV 的框架元素与 CompositionTarget.Rendering 挂钩,并且视觉对象会查询当前位置,该位置正在独立进行动画处理。我几乎可以接受这种方法。
尝试等待直到渲染 D3D 场景,然后再使图像无效(没有明显的改进):
_scene.Renderer.Render(_draw_args);
_scene.Renderer.Device.ImmediateContext.End(q);while (!(_scene.Renderer.Device.ImmediateContext.IsDataAvailable(q))) Thread.Yield();
_image.Invalidate();
观察:
- 我真的不认为这是一个性能问题。我的开发机器有一个很好的显卡,8 个 i7 内核等,这是一个简单的渲染操作。
- 这看起来确实像是 D3D 和 WPF 渲染之间的某种同步问题,但我不知道如何开始研究这个问题。
- 如果我有两个并行动画的图像,则抖动在两个图像中的第一个上更加明显(通常)。
- 如果我在制作动画时主动调整窗口大小,动画会非常流畅(尽管正在进行大量额外工作,因为 D3D 上下文正在不断调整大小)。
编辑
我已经尽可能地收回事情以尝试隔离问题,并且该问题似乎是 WPF 更新和呈现 D3DImage 的方式的基础。
我已经修改了 SharpDX Samples 解决方案中的 WPFHost 示例,以便显示的简单三角形在屏幕上显示动画。此示例托管在由 CompositionTarget.Rendering 上的 DPFCanvas 呈现的 DX10ImageSource 中。
这个例子再简单不过了,在 WPF 中渲染 D3DImage 时,它几乎是“接近金属”的。一个三角形,通过渲染之间的时间差计算的值在屏幕上平移。口吃仍然存在,来来去去,好像某种同步问题。它让我感到困惑,但本质上使 SharpDX 在 WPF 中无法用于任何类型的流畅动画,这非常令人失望。
如果有人有兴趣重现此问题,请在此处获得 SharpDX 示例:https ://github.com/sharpdx/SharpDX-Samples
我对 WPFHost 示例进行了以下简单更改:
在着色器 Simple.fx 中:
c#-4.0 - 如何使用 SlimDX.DirectSound 播放波形文件?
我是 SlimDX 的第一人。
我正在尝试播放波形文件。但它不起作用!
也许有什么不对??
使用 WinForms、SlimDX.DirectSound、SlimDX.Mutimemedia
directx - Directx 3D 较远的物体覆盖较近的物体
我是c#中DirectX的新手,有一个问题让我很困惑,基本上我想在屏幕上渲染两个立方体,一个离相机近,一个离相机远,这是我的预期是较近的总是在较远的前面,但实际上,它取决于渲染顺序,最后渲染的总是在另一个前面,我试图清除 z 缓冲区,但这不起作用全部,所以我想知道我做错了什么?
这是我的代码片段
c++ - 在 DX 12 VC++ 中从图像创建纹理
我只想知道 Directx 12 API 从图像创建纹理。
对于 DX11,它是 D3DX11CreateShaderResourceViewFromFile,对于 DX9,它是 D3DXCreateTextureFromFileEx,对于 DX12?
c# - 替换托管 DirectX 的方法?
我的旧项目有一些问题......如果简短的话 - “使用 Microsoft.DirectX”。他们弃用了,现在,我在新 PC 上运行我的游戏并遇到了各种故障和麻烦,这在以前是不存在的。由于它们已弃用且不再受支持,因此我正在寻找替代 gfx 引擎而又不丢失所有应用程序代码的好方法的解决方案。例如,旧的 XNA 项目可以移植到 MonoGame 或 FNA,而无需对其架构进行一般更改,我需要以同样的方式进行。这里有任何接近通过 API 管理的 directX 的框架,而无需为移植它们带来很多痛苦吗?夏普DX?瘦身DX?任何其他?(我之前没有使用 SharpDX 或 SlimDX 的经验)
这里有一些关于我的 GFX 代码的片段,只是为了想象它是怎样的。它们基于托管 DirectX。
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 或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。
如果有这个异常的处理程序,程序可以安全地继续。
c# - 画圆 C# Directx
我正在尝试使用托管 DirectX 在 C# 中绘制一个二维圆。(是的,它已过时,不受支持,我知道)
我在网上能找到的每一个例子都是用 C++ 编写的。他们使用 D3DTLVERTEX 之类的东西,我的 C# 库似乎没有。我不知道如何将 Directx C++ 转换为 Directx C#,因为它们在语法上似乎非常不同。
我正在使用这个简单的方法在 C# 中绘制一个矩形
我一次又一次地尝试画一个圆圈,但没有成功。如果圆圈被填充或只是圆圈轮廓,对我来说并不重要。谢谢。
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 无关。
崩溃调用堆栈如下所示: 应用程序中的错误。
directx - 使用 directx9 或 DX11 实现区域光
我想使用 Directx 9 实现 AreaLight 请帮助我了解如何开始。我研究了两个三个链接,但可以在 RenderMonkey 或 Direct With Sample 中实现
directx - 使用 In 的矩形区域光
我想像下面的链接 http://blog.selfshadow.com/sandbox/ltc.html使用 directx-9 来实现 Area Light Exact 我应该如何开始。