【问题标题】:How to implement high speed animation?如何实现高速动画?
【发布时间】:2010-11-22 10:28:34
【问题描述】:

我正在尝试编写一个应用程序(winforms),它可以演示两种振荡颜色如何产生第三种颜色。为此,我需要能够非常快速地在两种颜色之间切换(> 50 fps)。我真的希望在托管代码中做到这一点。

现在我正在绘制两个相互重叠的纯色小矩形位图。在启用双缓冲的控件中使用带有两个内存位图的 GDI+ DrawImage 不会削减它,并且会导致高速闪烁/撕裂。连接到滑块的计时器触发切换。

  1. 这是一种明智的做法吗?
  2. GDI 和 BitBLT 会更好吗?
  3. WPF 性能更好吗?
  4. DirectX 或其他呢? 技术?

非常感谢您的反馈,TIA!

【问题讨论】:

    标签: graphics animation directx gdi


    【解决方案1】:

    我从来没有用 GDI 来处理高速图形,所以我使用了 DirectX,但是 MS 已经放弃了对托管 DirectX 的支持,所以您可能需要在非托管 C++ 中执行此操作。

    只需用 C# 编写控制器,然后有一个非常薄的托管 C++ 层,它只调用支持 DirectX 的非托管 C++ DLL。

    你需要获得电脑的独占控制权,这样其他应用程序才能真正使用cpu,否则你会发现你的帧率可能会下降,或者至少不是很一致。

    如果您使用旧版本的 DirectX,例如 DirectX 9.0c,它可能仍然支持 .NET,我用它来获得大约 70 帧/秒的音乐程序的帧速率。

    【讨论】:

    • 我已经很多年没有写过 C++(实际上是从大学开始),但是如果我能用最少的 C++ 代码就可以了,那就太好了。
    • 不幸的是,如果您使用的是较新版本的 DirectX,您将使用更多的 C++,因此请查找我提到的版本。
    • 迟到的反馈,但无论如何:这最终成为了解决方案,由于一些棘手的问题,我找不到使用 SDL 的快速解决方案。找到了 DirectX 9.0c 版本,创建了一个执行图形魔术的 winform 控件。为了避免额外的 DirectX 安装,我只是捆绑了应用程序解决方案中所需的 MDX DLL。谢谢。
    【解决方案2】:

    使用双缓冲方法应该可以避免闪烁(我的意思只是将呈现控件的 DoubleBuffered 属性设置为 True - 具有讽刺意味的是,这对闪烁没有影响)。

    可以通过 DirectX 处理撕裂,但前提是您将帧速率与显示器的刷新率同步。这可能是不可能的,特别是如果您需要达到特定的帧速率(而且它恰好不是显示器的刷新率)。

    我认为 WPF 无法解决根本的撕裂问题(但我可能错了)。

    【讨论】:

      【解决方案3】:

      这将适用于 GDI,但您将无法控制闪烁,所以这是不可能的。 Direct X 可能只是为了显示两个不闪烁的图像而增加了很多额外的绒毛。也许 SDL 会运作良好?它是跨平台的,你可以用不到 30 行代码来编写这种效果。

      http://cs-sdl.sourceforge.net/index.php/SimpleExample

      【讨论】:

      • 我忘记了 SDL。肯定会对此进行测试,因为有可用的 .NET 库。这可能只是解决方案。
      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多