将游戏循环限制为每秒20帧

时间:2016-01-17 14:11:51

标签: c# game-engine

见下面我的主要游戏循环。我正在寻找一种方法将此循环限制为每秒20帧

    private void renderFrame()
    {

        while (Running)
        {
            game_controls.CheckKeyPress();
            Frame = game_graphics.DrawFrame();

            Panel_Graphics.DrawImage(Frame, 0, 0,320, 320);


            ThreadMonitor.MonitorFPS();

        }

    }

以下是ThreadMonitor类:

class Monitor
{

    private int FrameCount;
    private long TickCount;

    private int PanelPosition = 2;
    private Font font = new Font(FontFamily.GenericSansSerif, 12);

    private Graphics Monitor_Graphics;

    public Monitor(Graphics g)
    {
        AllocConsole();
        Monitor_Graphics = g;
    }

    public void MonitorFPS()
    {
        FrameCount++;

        if (Environment.TickCount >= TickCount + 1000)
        {
            Console.WriteLine("Running: " + FrameCount + "fps");
            FrameCount = 0;
            TickCount = Environment.TickCount;
        }

    }

    #region ShowConsole kernel32.dll

    /// <summary>
    /// Generates Console Window for debugging purposes
    /// </summary>
    /// <returns> Console </returns>

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    static extern bool AllocConsole();

    #endregion

我希望帧能够均匀生成我不希望游戏停止半秒钟。

我不确定如何实现这一点。

1 个答案:

答案 0 :(得分:3)

在循环内等待50ms不会使你的游戏达到20 FPS,这将使你的游戏最多20 FPS,通常更慢,这取决于你的循环内容和当前系统/ CPU负载。只要确保你了解其中的差异。

更好的方法是根据循环开头中的当前Environment.TickCount等待所需的毫秒数。例如,你的TickCount是120毫秒,你希望下一个游戏时间为150毫秒,你需要等待30毫秒,如果它已经是160毫秒,你根本不需要等待。