我在OpenGL上下文窗口中运行了一些动画,因此需要不断重绘它。所以我想出了以下代码:

private void InitializeRedrawTimer()
{
    var timer = new Timer();
    timer.Interval = 1000 / 60;
    timer.Tick += new EventHandler(timer_Tick);
    timer.Start();
}

private void timer_Tick(object sender, EventArgs e)
{
   glWin.Draw();
}
不过,这只能给我40 FPS。但是,如果将时间间隔设置为1毫秒,则可以达到60毫秒。那么其他20毫秒又去了哪里呢?那是因为计时器的精度差吗?如果我想让我的程序尽可能快地运行,有没有办法连续调用绘图函数?

最佳答案

您可以尝试实现游戏循环。

http://blogs.msdn.com/tmiller/archive/2005/05/05/415008.aspx


public void MainLoop()
{
        // Hook the application’s idle event
        System.Windows.Forms.Application.Idle += new EventHandler(OnApplicationIdle);
        System.Windows.Forms.Application.Run(myForm);
}

private void OnApplicationIdle(object sender, EventArgs e)
{
    while (AppStillIdle)
    {
         // Render a frame during idle time (no messages are waiting)
         UpdateEnvironment();
         Render3DEnvironment();
    }
}

private bool AppStillIdle
{
     get
    {
        NativeMethods.Message msg;
        return !NativeMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, 0);
     }
}

//And the declarations for those two native methods members:
[StructLayout(LayoutKind.Sequential)]
public struct Message
{
    public IntPtr hWnd;
    public WindowMessage msg;
    public IntPtr wParam;
    public IntPtr lParam;
    public uint time;
    public System.Drawing.Point p;
}

[System.Security.SuppressUnmanagedCodeSecurity] // We won’t use this maliciously
[DllImport(“User32.dll”, CharSet=CharSet.Auto)]
public static extern bool PeekMessage(out Message msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags);



此链接描述了使用应用程序的Idle事件的链接。它可能有用。您可以简单地进行一点时间测试或 sleep 以将其速度降低到所需的fps。尝试使用System.Diagnostics.StopWatch类获取最准确的计时器。

希望这会有帮助。

关于c# - .NET以60 FPS重绘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2063178/

10-13 06:47