如何实现高速动画?

时间:2009-08-24 21:48:00

标签: graphics animation directx gdi

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

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

  1. 这是一种明智的做法吗?
  2. GDI和BitBLT会更好吗?
  3. WPF表现更好吗?
  4. DirectX或其他什么 技术?
  5. 我真的很感谢反馈,TIA!

3 个答案:

答案 0 :(得分:2)

我从来没有幸运GDI做高速图形,所以我使用DirectX,但MS已经放弃了对Managed DirectX的支持,所以你可能需要在非托管C ++中这样做。

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

您需要获得对计算机的独占控制权,这样其他应用程序才能真正使用cpu,否则您会发现您的帧率可能会下降,或者至少不会非常一致。

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

答案 1 :(得分:1)

使用双缓冲方法可以避免闪烁(并且由此我意味着只是将渲染控件的DoubleBuffered属性设置为True - 具有讽刺意味的是,这对闪烁没有影响)。

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

我认为WPF不会解决基本的撕裂问题(但我可能错了)。

答案 2 :(得分:1)

这适用于GDI,但你无法控制闪烁,所以这是不可能的。直接X可能只是为了显示两个非闪烁图像而产生很多额外的毛茸茸。也许SDL会运作良好吗?它是跨平台的,您可以在不到30行代码中对此效果进行字面编码。

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