我在我的timer_tick方法中每10毫秒调用这段代码它运行正常,除非我添加更多的控件到列表。
我试着在线程中运行它。在while()循环中睡觉,但它似乎冻结了我的整个形式。
我怎样才能使这个代码运行得更快,并改变我的控件的位置?控制的类型有区别吗?我应该使用面板而不是图片框吗?
下面是我的代码:
private void notepreview_Tick(object sender, EventArgs e)
{
Invoke(new Action(() =>
{
foreach (PictureBox picbox in activeNotes)
{
picbox.Location = new Point(picbox.Location.X, picbox.Location.Y + 1);
//Console.WriteLine("x: " + picbox.Location.X);
//Console.WriteLine("y: " + picbox.Location.Y);
if (picbox.Location.Y > this.Height + 5)
{
picbox.Dispose();
tabPage16.Controls.Remove(picbox);
}
}
}));
}
,下面是它在我的表单中的样子:(每个音符都是单独产生的,所以延迟会慢慢上升,导致与音频和钢琴不同步)
imgur表单滞后展示
也许我应该用gdi+代替?它会提高性能吗?
我试着在这个问题的一个单独的线程中运行代码:从一个单独的线程访问一个窗体's控件
(听说使用FOR循环而不是foreach更快,但在这种情况下并没有真正的区别)
您可以尝试在循环上调用SuspendLayout
和ResumeLayout
,因此它不会为每个操纵的控件更新自己…但除此之外,如果它没有帮助,可能没有什么好方法可以让它更快。
而不是使用多个PictureBox
在你的形式,你动画的每个音符,考虑绘制移动音符矩形的整个场景到单个Graphics
,你渲染到单个PictureBox
。这也有一个方便的属性,能够完全确定地呈现,所以你可以准确地将它与你的音频同步。