我有一个带有面板的表单,我想在其中使用XNA显示动画3D场景。让这个面板不断重新粉刷的最佳方法是什么?
我目前正在考虑向表单添加System.Windows.Forms.Timer
并向Timer.Tick
添加事件处理程序,以更新我的3D场景并在面板上调用Invalidate
。
有更好的方法吗?渲染并不重要,我不希望表单的其余部分变得反应迟钝,但另一方面,如果有时间可用,我希望渲染以监视器的刷新率发生。
答案 0 :(得分:1)
是的,Timer会起作用。这是我在Microsoft示例中看到的一个聪明的技巧,它展示了如何在Winforms项目中使用XNA。它使用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);
}
}
我使用PictureBox而不是Panel来隐藏闪烁,PB打开了DoubleBuffered属性。但这与XNA无关。使用vsync不会起作用。你可能应该看看那个例子,当我尝试它时,'旋转三角形'是完全光滑的,没有任何撕裂。 This thread谈论它。