2014-03-31 43 views
0

我有一个图形WinForms控件的两个实例。该图形由DirectX渲染,并可能包含动画内容。Winforms饥饿控制失效

我开始通过实施不断呈现的内容:

public override void OnPaint(...) 
{ 
    base.OnPaint(...); 

    // Render scene 

    this.Invalidate(); 
} 

而且CPU占用率过高,这种方法会导致其他控件的无效的饥饿:一个控件的是一次又一次的重新描绘和其它控制等待为CPU执行失效请求,这是永远不会发生的(除非以某种方式强制它像调整窗口大小)。

所以我删除'this.Invalidate()'调用,只有在需要刷新时调用它。当没有动画显示时它确实解决了问题,但是如果两个控件都显示动画内容,则问题再次出现。

我想过在一个集中式管理器中管理应用程序中的所有控件,它将“调度”循环法中的无效调用。然而,我并不满意在一个集中的位置需要了解应用程序中的所有控件,我不确定这是否是解决问题的正确方法。

有没有解决这个问题的标准方法?

回答

1

在涂料事件期间您不需要Invalidate。这只会导致另一个油漆事件,一次又一次永远。当你的数据改变时你想要Invalidate,并且如果可能的话,你也可以只用一个区域来最小化重绘。

对于一个动画,你会想要根据你的帧率调用Invalidate。您可以使用Timer或其他一些机制来执行此操作。

+0

感谢您的回复,很高兴知道我的实施不符合标准。然而,当使用动画时,在渲染每帧之后立即一次又一次地失效导致更平滑的动画(并且我有一些客户注意到不同之处......)。因为动画是短时间的,所以我可以通过渲染这种方式并使用CPU,但我仍然不希望动画控件会导致其他控件挨饿。有没有办法做到这一点? – MaMazav

+0

@MaMazav:就像我说的,使用计时器。假设你想以20fps刷新。因此,创建一个计时器,将间隔设置为1000/20 = 50ms,并在Tick事件中调用“Invalidate”。 –