Главный цикл

29.01.99


Стандартный

Стандартный способ перерисовки окна — это послать окну сообщение, чтобы окно, в ответ на это сообщение, перерисовало себя. Когда программа посылает окну сообщение, в дело вступает Windows. Windows может поговорить сама с собой, сделать пока что-нибудь, решить, что сейчас окно в перерисовке не нуждается, и отложить сообщение...

Игровой

В играх все не так. Игра не может ждать систему. Конечно, игра должна давать Windows перерисовать заголовок окна, если его чем-нибудь загородили... дать возможность пользователю закрыть окно... Но игра не должна ждать Windows, пока та передаст сообщение о перерисовке.

Так что игры не передают Windows сообщение о необходимой перерисовке. Просто перерисовывают когда захотят, а потом дают Windows обработать свои сообщения.

Вот — процедура, которая дает Windows обработать сообщения. Она возвращает false, если наткнется на сообщение о том, что программа должна завершиться.

bool TreatWindowsMessages()
{
    MSG msg;
    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        if (msg.message == WM_QUIT)
            return false;
    }
    return true;
}

Вот — главный цикл программы, который обычно используют игры.

    // Здесь инициализация

    while (TreatWindowsMessages())
    {
        // Здесь просчитывать положение объектов 
        // для следующего кадра

        // Здесь рисовать все, что нужно
    }

    // Здесь код завершения программы

Главный цикл немного упрощен, поскольку программа пока не использует устройств ввода — клавиатуру, мышь, сеть. Когда это добавится в программу, я перепишу главный цикл.

Пример

Там почти ничего нет — просто каркас: инициализация/деинициализация и начало/конец рендеринга. Но если его запустить... если запустить — получится темное окно!

Следующая страница: Цветной треугольник


(c) 2000 Константин Михеев — проект "Elfish Engine"