C#无锁定UI的多个短延迟
我正在尝试编写一个简单的Snake应用程序,使用空白面板和表布局窗格来形成网格。我决定“形成”我的蛇的方式是在我的网格上创建一个移动的“头”,将面板背景更改为黑色。任何时候面板从黑色变为白色,都会增加一个小的延迟(十分之一秒)。蛇的生长或收缩取决于延迟的大小C#无锁定UI的多个短延迟,c#,multithreading,winforms,C#,Multithreading,Winforms,我正在尝试编写一个简单的Snake应用程序,使用空白面板和表布局窗格来形成网格。我决定“形成”我的蛇的方式是在我的网格上创建一个移动的“头”,将面板背景更改为黑色。任何时候面板从黑色变为白色,都会增加一个小的延迟(十分之一秒)。蛇的生长或收缩取决于延迟的大小 Task.Factory.StartNew(() => Thread.Sleep(100 * (snake.getLength() - 1))) .ContinueWith(t =>
Task.Factory.StartNew(() => Thread.Sleep(100 * (snake.getLength() - 1)))
.ContinueWith(t =>
{
tableLayoutPanel1.GetControlFromPosition(oldColumn, oldRow).BackColor = Color.White;
});
这对于较小的蛇来说效果很好,但对于较大尺寸的蛇,我注意到性能下降,而且背景颜色有时不会重置。我假设这是由于创建/销毁了大量线程
有没有一种方法可以减少我正在使用的线程数量?还有什么其他方法可以添加这样的延迟?游戏通常有更新和渲染线程。更新线程以固定的时间步运行(或者可以使用增量时间运行),执行游戏逻辑并改变游戏状态。渲染分别进行,并绘制游戏对象的位置等。我想你可能想将你的蛇“段”存储在一个有序的数组(
列表
)中,并将它们的位置更新到更新循环中的新位置。渲染可以检查哪些面板被占用并更改颜色。您不应该使用Thread.Sleep,使用Task.Delay。之后,您应该使用tablLayoutPanel.Invoke更改颜色,不要直接设置。切换到TaskEx.Delay似乎效果更好。但是我很好奇,使用invoke方法比直接设置颜色有什么好处?