2010-11-18 6 views
-1

J'ai un formulaire avec un panneau dans lequel je veux afficher une scène 3D animée en utilisant XNA. Quelle est la meilleure façon de faire repeindre ce panneau en permanence?Quelle est la meilleure façon de conduire une animation?

Je suis actuellement en train d'envisager d'ajouter un System.Windows.Forms.Timer au formulaire et d'ajouter un gestionnaire d'événements à Timer.Tick qui met à jour ma scène 3D et appelle Invalidate sur le panneau.

Y a-t-il une meilleure façon de procéder? Le rendu n'est pas critique, je ne veux pas que le reste du formulaire ne réponde plus, mais d'un autre côté, si le temps est disponible, je voudrais que le rendu se fasse à la fréquence de rafraîchissement du moniteur.

Répondre

1

Oui, une minuterie fonctionnerait. Voici un astucieux truc que j'ai vu utilisé dans un exemple Microsoft qui montre comment utiliser XNA dans un projet Winforms. Il utilise l'événement Application.Idle:

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); 
    } 
} 

J'ai utilisé un PictureBox à la place d'un groupe spécial pour cacher le scintillement, PB a la propriété DoubleBuffered activée. Ce n'est pas très pertinent pour XNA cependant. L'utilisation de vsync ne fonctionnera pas. Vous devriez probablement vérifier cet exemple, le «triangle tournant» était complètement lisse sans aucune déchirure quand je l'ai essayé. This thread en parle.

Questions connexes