/ / Starvation of Winforms-Steuerelementvalidierung - c #, Winforms, Animation, DirectX

Starvation von WinForms Kontrolle Ungültigkeits - c #, WinForms, animation, directx

Ich habe zwei Instanzen eines Grafik-WinForms-Steuerelements. Die Grafiken werden von DirectX gerendert und können animierte Inhalte enthalten.

Ich begann mit der Implementierung der kontinuierlich gerenderten Inhalte von:

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

// Render scene

this.Invalidate();
}

Diese Methode verursacht neben einer hohen CPU-Auslastung fürVerhinderung des Ungültigmachens anderer Steuerelemente: Eines der Steuerelemente wird immer wieder neu gerendert, und andere Steuerelemente warten darauf, dass die CPU ihre Ungültigkeitsanforderung ausführt, was niemals der Fall ist (es sei denn, dies erzwingt eine Art Fensteränderung).

Also entfernte ich das ".Invalidate () "aufrufen und nur aufrufen, wenn eine Aktualisierung erforderlich ist. Das Problem wird gelöst, wenn keine Animation angezeigt wird. Wenn jedoch beide Steuerelemente animierten Inhalt anzeigen, wird das Problem erneut angezeigt.

Ich habe darüber nachgedacht, alle Steuerungen in derAnwendung in einem zentralen Manager, der Anrufe in Round-Robin "einplanen" soll. Ich bin jedoch nicht zufrieden mit der Notwendigkeit, alle Steuerelemente in der Anwendung an einem zentralen Ort zu kennen, und ich bin nicht sicher, ob dies der richtige Weg ist, um das Problem zu lösen.

Gibt es eine Standardmethode, um dieses Problem zu überwinden?

Antworten:

1 für die Antwort № 1

Du nicht Invalidate während eines Farbereignisses. Das wird nur dazu führen Ein weiterer Malereignis immer wieder für immer. Du möchtest Invalidate Wenn sich Ihre Daten ändern, können Sie dies auch tun Invalidate wenn möglich nur eine Region, um das Neuzeichnen zu minimieren.

Für eine Animation möchten Sie anrufen Invalidate basierend auf Ihrer Framerate. Sie können eine verwenden Timer oder einen anderen Mechanismus, um dies zu tun.