|
フレームレートを固定化したゲームループの作り方 |
|
[GO!] コマンドプロンプト推奨ゲームループを知りたい [GO!] Win32SDK 推奨ゲームループを知りたい [GO!] MFC 推奨ゲームループを知りたい |
|
#define FRAME_RATE (1000/50) // フレームレート |
|
::timeBeginPeriod(1); while (1) { Games(); Sleep(FRAME_RATE); } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); while (1) { Games(); Sleep(FRAME_RATE - 10); } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); while (1) { DWORD dwTime = ::timeGetTime(); Games(); dwTime = ::timeGetTime() - dwTime; Sleep(FRAME_RATE - dwTime); } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); while (1) { DWORD dwCheck = ::timeGetTime() + FRAME_RATE; Games(); while (dwCheck > ::timeGetTime()); } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); while (1) { DWORD dwCheck = ::timeGetTime() + FRAME_RATE; Games(); while (dwCheck > ::timeGetTime()) Sleep(1); } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); while (1) { MSG msg; switch (::GetMessage(&msg, NULL, 0, 0)){ case 0: return EXIT_SUCCESS; case -1: return EXIT_FAILURE; default: ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); while (1) { MSG msg; if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if (msg.message == WM_QUIT) return EXIT_SUCCESS; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } Sleep(1); } ::timeEndPeriod(1); |
|
::timeBeginPeriod(1); DWORD dwTime = ::timeGetTime() + FRAME_RATE; while (1) { MSG msg; if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if (msg.message == WM_QUIT) return EXIT_SUCCESS; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } if (dwTime > ::timeGetTime()) { Sleep(1); continue; } dwTime = ::timeGetTime() + FRAME_RATE; Games(); } ::timeEndPeriod(1); |
|
// CMyApp 初期化 BOOL CMyApp::InitInstance() { ::timeBeginPeriod(1); } // CMyApp 後片付け int CMyApp::ExitInstance() { ::timeEndPeriod(1); } // CMyApp メッセージ ハンドラ BOOL CMyApp::OnIdle(LONG lCount) { static DWORD s_dwTime = ::timeGetTime() + FRAME_RATE; if (s_dwTime > ::timeGetTime()) { Sleep(1); } else { s_dwTime = ::timeGetTime() + FRAME_RATE; Games(); } return TRUE; // return CWinApp::OnIdle(lCount); } |