C#低定时器间隔=慢抽取时间?

时间:2014-03-17 18:53:13

标签: c# forms timer intervals pong

我试图制作一个简单的乒乓球游戏,但是我遇到了这个问题,每个timer1 tick(间隔设置为1ms)应该移动1个像素的白色桨状矩形,如果' S&#39 ;或者' W'按下按钮,这意味着理论上我的400px高度图片框中的白色矩形应该在0.4-0.8秒内从y = 0移动到y = 400,但显然需要超过4整秒。

我知道计时器刻度事件可能会跳过"跳过"如果cpu已经忙或处理速度问题,但我试图使蛇游戏比这50行代码更复杂,并且绘制的蛇的速度实际上是低时间间隔的准确

为什么需要这么多?

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        pictureBox1.BackColor = Color.Black;

        timer1.Interval = 1;
        timer1.Start();
    }


    private void timer1_Tick(object sender, EventArgs e)
    {
        PongGame.CheckIfMoving();
        PongGame.DrawIt(pictureBox1);
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.S)
        { PongGame.movesDown = true; }

        if (e.KeyData == Keys.W)
        { PongGame.movesUp = true; }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.S)
        { PongGame.movesDown = false; }

        if (e.KeyData == Keys.W)
        { PongGame.movesUp = false; }
    }
}



public class PongGame
{
    public static Rectangle paddle1 = new Rectangle(14, 370, 20, 100);
    public Rectangle paddle2;
    public static bool movesUp;
    public static bool movesDown;
    public static Graphics Draw;

    public static void DrawIt(PictureBox pb1)
    {
        Draw = pb1.CreateGraphics();
        SolidBrush sb = new SolidBrush(Color.White);

        Draw.Clear(Color.Black);
        Draw.FillRectangle(sb, paddle1);
    }

    public static void CheckIfMoving()
    {
        if (movesUp == true)
        {
            paddle1.Y -= 1;
        }

        if (movesDown == true)
        {
            paddle1.Y += 1;
        }
    }
}

提前感谢您的回答(:

2 个答案:

答案 0 :(得分:0)

计时器不保证它会以您指定的间隔触发。实际上,它可以并且确实以比您指定的间隔更长的间隔触发。

通常,计时器的实际间隔与底层系统和硬件有关。 Windows上的计时器发射频率不超过20Hz,这种情况并不少见。

如果您要制作基于计时器的游戏,请使用计时器为您的游戏提供脉搏,定期心跳。当计时器触发时,使用自上次计时器事件以来更新状态的时间量。您需要使用准确的时间度量。 Stopwatch类应该足够了。

您还错误地使用了图片框。这是一个事件驱动的控制。您应该在图片框的Paint事件的处理程序中绘制场景。

答案 1 :(得分:0)

首先,将Timer的间隔设置为1会在这种情况下产生不必要的开销。这是1000fps(好吧,如果你真的可以信任Timer,那就是)

在DrawIt中:

Draw = pb1.CreateGraphics();
SolidBrush sb = new SolidBrush(Color.White);

这一点,因为DrawIt被Timer's tick调用,所以每秒1000次重新创建Graphics和Brush。你要放在那里要小心。

此外,您不应该使用Picturebox的CreateGraphics方法。相反,覆盖它的OnPaint方法,并在其上调用Refresh。

您可以在Bob Powell's Website

上详细了解相关信息