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 № 1Du 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.