Я просто пытаюсь научиться программировать несколько вещей, и игровой цикл является одним из них.
Этот игровой цикл обрабатывает только сообщения Windows, но он даже не может обрабатывать 30 кадров в секунду.
Это также верно, если обработка сообщения выполняется только один раз за цикл, заменяя WHILE на IF.
Я использую QueryPerformanceCounter() функция, чтобы получить количество тиков по 100 нс до завершения работы и после, вычитая их, чтобы получить использованное время. Время цикла составляет 100 нс * 166666 * 2 = 0,0333332 с.
Булевое значение timeExceeded устанавливается, если время ожидания положительное, что указывает на то, что используемое время превышает запланированное время цикла.
Что делать?
// timer data
LARGE_INTEGER start_time;
LARGE_INTEGER end_time;
LARGE_INTEGER rest_time;
LARGE_INTEGER loop_time;
loop_time.QuadPart = -166666LL*2; // loop time
bool timeExceeded = false; // does time exceeds loop time
// message loop data
MSG msg = { };
bool running = true;
while (running)
{
// measure time
if (!QueryPerformanceCounter(&start_time))
break;
// process messages
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
running = false;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// other work
// Get elapsed time and wait for (30hz - elapsed time)
if (!QueryPerformanceCounter(&end_time))
break;
rest_time.QuadPart = loop_time.QuadPart + (end_time.QuadPart - start_time.QuadPart);
if (rest_time.QuadPart >= 0)
{
timeExceeded = true;
continue;
}
if (!SetWaitableTimer(hTimer, &rest_time, 0, 0, 0, 0))
break;
if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
break;
}
// clean up
CloseHandle(hTimer);
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... -30hz-what