2010-11-18 17 views
-1

Ich habe ein Formular mit einem Panel, in dem ich eine animierte 3D-Szene mit XNA anzeigen möchte. Was ist der beste Weg, um dieses Panel ständig neu zu streichen?Was ist der beste Weg, um eine Animation zu fahren?

Ich überlege mir gerade, dem Formular System.Windows.Forms.Timer hinzuzufügen und einen Ereignishandler zu Timer.Tick hinzuzufügen, der meine 3D-Szene aktualisiert und Invalidate auf dem Panel aufruft.

Gibt es einen besseren Weg, dies zu tun? Das Rendering ist nicht kritisch, ich möchte nicht, dass der Rest des Formulars unempfindlich wird, aber andererseits, wenn es Zeit gibt, möchte ich, dass das Rendering mit der Aktualisierungsrate des Monitors abläuft.

Antwort

1

Ja, ein Timer würde funktionieren. Hier ist ein cleverer Trick, den ich in einem Microsoft-Beispiel gesehen habe, das gezeigt hat, wie man XNA in einem Winforms-Projekt verwendet. Es nutzt die Application.Idle Veranstaltung:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint); 
     Application.Idle += new EventHandler(Application_Idle); 
     this.FormClosed += delegate { Application.Idle -= Application_Idle; }; 
    } 

    private void Application_Idle(object sender, EventArgs e) { 
     pictureBox1.Invalidate(); 
    } 

    int cnt; 
    void pictureBox1_Paint(object sender, PaintEventArgs e) { 
     cnt++; 
     e.Graphics.DrawString(cnt.ToString(), this.Font, Brushes.Black, 0, 0); 
    } 
} 

ich eine PictureBox anstelle eines Panels verwendet, um das Flimmern zu verbergen, PB hat die Eigenschaft DoubleBuffered eingeschaltet. Das ist jedoch für XNA nicht sehr relevant. Vsync wird nicht funktionieren afaik. Sie sollten wahrscheinlich dieses Beispiel ausprobieren, das "spinning triangle" war völlig glatt ohne zu reißen, wenn ich es versuchte. This thread spricht darüber.

Verwandte Themen