Пользовательский игровой цикл XNA в Windows

Я пытаюсь понять, как управлять всем игровым циклом вручную в игре для Windows, без использования обычного класса Game Microsoft.Xna.Framework.Game.

Причина в том, что использование обычного класса Game вызывает некоторые заикания в моей игре. Немного, но из-за специфики игры все же хорошо видно.

Попробовав кучу различных настроек (vsync, fixedtimestep, разная частота кадров и т. Д.), Я решил попробовать написать свой собственный класс Game, чтобы иметь полный контроль над временем. Я не уверен, что это исправит, но, по крайней мере, таким образом у меня есть полный контроль.

В основном мне нужно:

  1. Настроить окно игры
  2. В цикле: выполнить всю визуализацию как обычно, а затем выводить результат на экран, управлять резервными буферами и т.д.

Кто-нибудь знает, как это сделать? На самом деле это звучит довольно просто, но не удалось найти никакой документации о том, как это сделать.


Не уверен, что я делаю неправильно, но у меня есть следующий код (только для тестирования, время будет обрабатываться по-другому),и цикл будет работать некоторое время, затем остановится. Как только я наведу указатель мыши на окно, цикл снова начнется на некоторое время.

    private void Application_Idle(object pSender, EventArgs pEventArgs)
    {
        Thread.Sleep(500);
        //Message message;
        //while (!PeekMessage(out message, IntPtr.Zero, 0, 0, 0))
        {
            gametime.update();
            Update(gametime);
            Draw(gametime);
            GraphicsDevice.Present();
        }
    }

Если включить "while PeekMessage", цикл будет выполняться непрерывно, но игнорируя спящий режим, а также останавливаться, когда мышь перемещается по окну. . Не уверен, что здесь происходит ...

Я думаю, что оптимально я бы просто хотел сделать что-то простое, например, в основном цикле рендеринга:

    while (alive)
    {
      Thread.Sleep(100);
      gametime.update();
      Update(gametime);
      Draw(gametime);
      GraphicsDevice.Present();
    }

Но в этом случае окно остается пустым, поскольку кажется, что окно фактически не перерисовывается с новым содержанием. Я попробовал form.Refresh (), но все равно не пошел ... Есть идеи?

10
задан Taryn 23 March 2014 в 02:04
поделиться