【问题标题】:DrawImage / DrawLine using XNA / DirectX使用 XNA/DirectX 的 DrawImage/DrawLine
【发布时间】:2011-07-06 13:24:09
【问题描述】:

我正在构建一个歌曲可视化,我需要每 50 毫秒计算一个新位图,并通过在图片框上绘制它来在表单上显示它。

不幸的是,使用 DrawImage / DrawLine 时,此图像的渲染/绘画性能并不快。

有没有办法通过使用 XNA / DirectX 来改进?

哪个更适合这项任务?

有什么例子吗?

【问题讨论】:

    标签: c# forms xna directx


    【解决方案1】:

    XNA 在后台使用 DirectX。此外,您不能再在 C# 中直接使用普通 DirectX,因为 XNA 导致 ManagedDX 停止使用。例如,slimdx 也有其他选择。 XNA 更接近于使用 directx 的引擎。您需要的是一种更底层的方法,其中绘图性能似乎不是真正的问题,而是托管内存 io 操作。我建议使用 Direct2D(也是 slimdx 的一部分),它使用硬件加速,更适合 2D 渲染。您也可以尝试this 并完全手动操作位图。

    【讨论】:

    • hmm 所以事实上不使用 3rd 方框架就没有直接的解决方案?
    • @nr1 XNA 是一个第一方框架。在 App Hub 上查找 XNA WinForms 示例,了解如何将 XNA 与 WinForms 一起使用。
    • @Nr1 看最后一个链接,你仍然可以选择直接在位图中写入,也许它对你来说已经足够快了。我仍然可以肯定,您的问题不在于绘图性能,而在于访问和修改托管内存的方式。使用 XNA、SlimDX 等来填充图像会产生很多开销……我敢肯定,通过适当的优化,您可以仅使用普通位图来完成此操作。当然,这取决于位图有多大。
    • 嗯,所以我仍然不确定如何做到最好。使用 XNA 时,支持图形卡的着色器是先决条件,对于 SlimDX,我没有发现“只是”显示如何在 Windows 窗体控件(或类似的东西)上绘制位图的示例..
    • SlimDX 的级别非常低,您需要做一些工作才能完成。但就像我之前说的,我刚刚提到了 SlimDX,因为你提到了 XNA。我仍然认为,XNA 和 SlimDX 的开销都很大,而且没有必要,因为我相信它可以通过我之前评论中的最后一个链接来完成。你试过了吗?
    【解决方案2】:

    我同意以类似于 winforms 示例的方式使用 xna。

    我认为你可能不是通过渲染位图或使用 SpriteBatch 而是通过创建一个动态顶点缓冲区来包含所有线条的所有端点来获得线条的最佳外观和性能。然后使用 DrawUserPrimitives() 并将primitiveType 参数指定为 PrimitiveType.LineList。

    这会将所有这些点发送到 GPU,在那里您可以在线条上创建各种效果(着色器),而 GPU 会完成所有繁重的工作。

    应用中心的教育部分中的一些示例使用这种渲染来制作网格。想到的一个是perPixelLighting sample。您可能(或可能不需要)需要在 3d 空间中进行一些工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多