1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-06 13:16:52 +02:00

30 updates per second (Core::UPS)

This commit is contained in:
XProger
2020-07-18 17:25:57 +03:00
parent b7d6ce5b13
commit e276196572
3 changed files with 41 additions and 25 deletions

View File

@@ -176,6 +176,8 @@ extern void osMutexFree (void *obj);
extern void osMutexLock (void *obj); extern void osMutexLock (void *obj);
extern void osMutexUnlock (void *obj); extern void osMutexUnlock (void *obj);
extern int64 osGetCounter ();
extern int64 osGetFrequency ();
extern int osGetTimeMS (); extern int osGetTimeMS ();
extern bool osJoyReady (int index); extern bool osJoyReady (int index);
@@ -229,6 +231,10 @@ enum RenderTargetOp {
namespace Core { namespace Core {
enum {
UPS = 30,
};
struct Mutex { struct Mutex {
void *obj; void *obj;

View File

@@ -203,17 +203,17 @@ namespace Game {
if (Input::lastState[1] == cStart) level->addPlayer(1); if (Input::lastState[1] == cStart) level->addPlayer(1);
} }
/*
float dt = Core::deltaTime; float dt = Core::deltaTime;
if (Input::down[ikR]) // slow motion (for animation debugging) if (Input::down[ikR]) // slow motion (for animation debugging)
Core::deltaTime /= 10.0f; Core::deltaTime /= 10.0f;
*/
if (Input::down[ikT]) // fast motion if (Input::down[ikT]) // fast motion
for (int i = 0; i < 9; i++) for (int i = 0; i < 9; i++)
level->update(); level->update();
level->update(); level->update();
Core::deltaTime = dt;
} }
void quickSave() { void quickSave() {
@@ -247,17 +247,23 @@ namespace Game {
} }
} }
int32 lastFrame = -1;
bool update() { bool update() {
// async load for settings // async load for settings
if (Core::settings.version == SETTINGS_READING) if (Core::settings.version == SETTINGS_READING)
return true; return true;
PROFILE_MARKER("UPDATE");
if (!Core::update()) if (!Core::update())
return false; return false;
float delta = Core::deltaTime; int32 frame = int32(osGetCounter() * 30L / osGetFrequency());
int32 frameDelta = frame - lastFrame;
lastFrame = frame;
if (frameDelta <= 0) {
return false;
}
if (nextLevel) { if (nextLevel) {
startLevel(nextLevel); startLevel(nextLevel);
@@ -293,15 +299,9 @@ namespace Game {
Input::down[ik9] = false; Input::down[ik9] = false;
} }
if (!level->level.isCutsceneLevel()) Core::deltaTime = 1.0f / Core::UPS;
delta = min(0.2f, delta); for (int i = 0; i < frameDelta; i++) {
while (delta > EPS) {
Core::deltaTime = min(delta, 1.0f / 30.0f);
Game::updateTick(); Game::updateTick();
delta -= Core::deltaTime;
if (Core::resetState) // resetTime was called
break;
} }
return true; return true;

View File

@@ -47,18 +47,29 @@ void osMutexUnlock(void *obj) {
} }
// timing // timing
int osStartTime = 0; int64 osCounterStart = 0;
int64 osCounterFrequency = 0;
int64 osGetCounter() {
LARGE_INTEGER value;
QueryPerformanceCounter(&value);
return value.QuadPart - osCounterStart;
}
int64 osGetFrequency() {
return osCounterFrequency;
}
int osGetTimeMS() { int osGetTimeMS() {
#ifdef DEBUG return int32(osGetCounter() * 1000L / osCounterFrequency);
LARGE_INTEGER Freq, Count; }
QueryPerformanceFrequency(&Freq);
QueryPerformanceCounter(&Count); void initCounter() {
return int(Count.QuadPart * 1000L / Freq.QuadPart); LARGE_INTEGER value;
#else QueryPerformanceCounter(&value);
timeBeginPeriod(0); osCounterStart = value.QuadPart;
return int(timeGetTime()) - osStartTime; QueryPerformanceFrequency(&value);
#endif osCounterFrequency = value.QuadPart;
} }
// common input functions // common input functions
@@ -929,7 +940,6 @@ int main(int argc, char** argv) {
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtMemCheckpoint(&_msBegin); _CrtMemCheckpoint(&_msBegin);
//#elif PROFILE
#elif PROFILE #elif PROFILE
int main(int argc, char** argv) { int main(int argc, char** argv) {
#else #else
@@ -1017,7 +1027,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
Sound::channelsCount = 0; Sound::channelsCount = 0;
osStartTime = Core::getTime(); initCounter();
touchInit(hWnd); touchInit(hWnd);
joyInit(); joyInit();