我正在尝试编写一个应用程序(winforms),它可以演示两种振荡颜色将如何产生第三种颜色。为此,我需要能够非常快速地在两种颜色之间切换(> 50fps)。我真的希望在托管代码中这样做。
现在我正在绘制两个颜色相同的小矩形位图。在双缓冲启用控件中使用带有两个内存中位图的GDI + DrawImage不会削减它并导致高速闪烁/撕裂。连接到滑块的定时器触发切换。
我真的很感谢反馈,TIA!
答案 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行代码中对此效果进行字面编码。