C#简单2d游戏 - 制作基本游戏循环

dim*_*s93 4 c# winforms

虽然我有一些c#的经验,但这是我在C#中的第一款游戏.我正在尝试建立游戏最小骨架.我听说这Tick Event是创建主游戏循环的糟糕方法.

这是我想要实现的主要概念:

Program.cs中

//Program.cs calls the Game Form.
Application.Run(new Game());
Run Code Online (Sandbox Code Playgroud)

Game.cs

public partial class Game : Form
{
    int TotalFramesCount = 0;
    int TotalTimeElapsedInSeconds = 0;

    public Game()
    {
        InitializeComponent();
        GameStart();
    }

    public void GameStart()
    {
        GameInitialize();

        while(true)
        {                
            GameUpdate();                
            TotalFramesCount++;
            CalculateTotalTimeElapsedInSeconds();
            //Have a label to display FPS            
            label1.text = TotalFramesCount/TotalTimeElapsedInSeconds;
        }
    }

    private void GameInitialize()
    {
        //Initializes variables to create the First frame.
    } 

    private void GameUpdate()
    {
        // Creates the Next frame by making changes to the Previous frame 
        // depending on users inputs.           
    }     

    private void CalculateTotalTimeElapsedInSeconds()
    {
        // Calculates total time elapsed since program started
        // so that i can calculate the FPS.            
    }  

}
Run Code Online (Sandbox Code Playgroud)

现在,这不起作用,因为while(true)循环阻止游戏表单初始化.我找到了一些解决方案,通过使用System.Threading.Thread.Sleep(10);Application.DoEvents();,但我没有设法让它工作.

解释为什么我想要实现此验证码是一个例子使用上面的代码:
可以说,我想我的游戏做到以下几点:
平滑移动100x100 Black colored Square从点(x1,y1)(x2,y2)和向后,在一个循环,并在显示FPS label1的上面的代码.考虑到上面的代码,我可以使用TotalTimeElapsedInSeconds变量来设置移动的速度与Time而不是相关Frames,因为Frames每台机器上的不同.

// Example of fake code that moves a sqare on x axis with 20 pixels per second speed
private void GameUpdate()
{
int speed = 20;
MySquare.X = speed * TotalTimeElapsedInSeconds;
}
Run Code Online (Sandbox Code Playgroud)

我使用while(true)循环的原因是我将获得每台机器上最好的FPS.

  • 我怎么能在实际代码上实现我的想法?(只是基本的骨架是我正在寻找的)
  • 我怎么能设置最大值,让500 FPS使代码"更轻"运行?而不是试图产生尽可能多的帧,我怀疑它会过度使用CPU(?)

γηρ*_*όμε 6

帧率与平滑度无关.即使你达到500帧/秒,运动也会变得不稳定或更糟.诀窍是与您的显示器刷新率同步.因此,对于60Hz的显示器,您需要60帧/秒而不是更少.你不能通过在C#中使用循环来做到这一点.您需要DirectX或XNA.这些框架可以使您的绘图与显示器的垂直扫描同步.

  • 大多数显示器以60hz(每秒60次)刷新 - 由于显示器无法显示两者之间渲染的帧,因此在此数量的FPS上渲染很多次几乎没有意义.如果你没有锁定更新到屏幕刷新它会导致撕裂(显示器绘制一个图形框架的一部分和下一帧的一部分,依此类推) - 这可能会导致一个明显的人工制品,这在游戏中会非常分散注意力:http://en.wikipedia.org/wiki/Screen_tearing (3认同)