mirror of
https://github.com/rwengine/openrw.git
synced 2024-09-18 16:32:32 +02:00
rwgame: Refactor run() into seperate methods to ease profiling
This commit is contained in:
parent
2670de509f
commit
4e1535ca99
@ -367,13 +367,77 @@ int RWGame::run() {
|
|||||||
while (StateManager::currentState() && running) {
|
while (StateManager::currentState() && running) {
|
||||||
RW_PROFILE_FRAME_BOUNDARY();
|
RW_PROFILE_FRAME_BOUNDARY();
|
||||||
|
|
||||||
|
running = updateInput();
|
||||||
|
|
||||||
|
auto currentFrame = chrono::steady_clock::now();
|
||||||
|
auto frameTime =
|
||||||
|
chrono::duration<float>(currentFrame - lastFrame).count();
|
||||||
|
lastFrame = currentFrame;
|
||||||
|
|
||||||
|
if (!world->isPaused()) {
|
||||||
|
accumulatedTime += frameTime;
|
||||||
|
|
||||||
|
// Clamp frameTime, so we won't freeze completely
|
||||||
|
if (frameTime > 0.1f) {
|
||||||
|
frameTime = 0.1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
accumulatedTime = tickWorld(deltaTime, accumulatedTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
render(1, frameTime);
|
||||||
|
|
||||||
|
getWindow().swap();
|
||||||
|
|
||||||
|
// Make sure the topmost state is the correct state
|
||||||
|
StateManager::get().updateStack();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.close();
|
||||||
|
|
||||||
|
StateManager::get().clear();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float RWGame::tickWorld(const float deltaTime, float accumulatedTime) {
|
||||||
|
auto deltaTimeWithTimeScale =
|
||||||
|
deltaTime * world->state->basic.timeScale;
|
||||||
|
|
||||||
|
RW_PROFILE_BEGIN("Update");
|
||||||
|
while (accumulatedTime >= deltaTime) {
|
||||||
|
if (!StateManager::currentState()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
RW_PROFILE_BEGIN("physics");
|
||||||
|
world->dynamicsWorld->stepSimulation(
|
||||||
|
deltaTimeWithTimeScale, kMaxPhysicsSubSteps, deltaTime);
|
||||||
|
RW_PROFILE_END();
|
||||||
|
|
||||||
|
RW_PROFILE_BEGIN("state");
|
||||||
|
StateManager::get().tick(deltaTimeWithTimeScale);
|
||||||
|
RW_PROFILE_END();
|
||||||
|
|
||||||
|
RW_PROFILE_BEGIN("engine");
|
||||||
|
tick(deltaTimeWithTimeScale);
|
||||||
|
RW_PROFILE_END();
|
||||||
|
|
||||||
|
getState()->swapInputState();
|
||||||
|
|
||||||
|
accumulatedTime -= deltaTime;
|
||||||
|
}
|
||||||
|
RW_PROFILE_END();
|
||||||
|
return accumulatedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RWGame::updateInput() {
|
||||||
RW_PROFILE_BEGIN("Input");
|
RW_PROFILE_BEGIN("Input");
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
running = false;
|
return false;
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_WINDOWEVENT:
|
case SDL_WINDOWEVENT:
|
||||||
switch (event.window.event) {
|
switch (event.window.event) {
|
||||||
@ -406,74 +470,7 @@ int RWGame::run() {
|
|||||||
RW_PROFILE_END()
|
RW_PROFILE_END()
|
||||||
}
|
}
|
||||||
RW_PROFILE_END();
|
RW_PROFILE_END();
|
||||||
|
return true;
|
||||||
auto currentFrame = chrono::steady_clock::now();
|
|
||||||
auto frameTime =
|
|
||||||
chrono::duration<float>(currentFrame - lastFrame).count();
|
|
||||||
lastFrame = currentFrame;
|
|
||||||
|
|
||||||
if (!world->isPaused()) {
|
|
||||||
accumulatedTime += frameTime;
|
|
||||||
|
|
||||||
// Clamp frameTime, so we won't freeze completely
|
|
||||||
if (frameTime > 0.1f) {
|
|
||||||
frameTime = 0.1f;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto deltaTimeWithTimeScale =
|
|
||||||
deltaTime * world->state->basic.timeScale;
|
|
||||||
|
|
||||||
RW_PROFILE_BEGIN("Update");
|
|
||||||
while (accumulatedTime >= deltaTime) {
|
|
||||||
if (!StateManager::currentState()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
RW_PROFILE_BEGIN("physics");
|
|
||||||
world->dynamicsWorld->stepSimulation(
|
|
||||||
deltaTimeWithTimeScale, kMaxPhysicsSubSteps, deltaTime);
|
|
||||||
RW_PROFILE_END();
|
|
||||||
|
|
||||||
RW_PROFILE_BEGIN("state");
|
|
||||||
StateManager::get().tick(deltaTimeWithTimeScale);
|
|
||||||
RW_PROFILE_END();
|
|
||||||
|
|
||||||
RW_PROFILE_BEGIN("engine");
|
|
||||||
tick(deltaTimeWithTimeScale);
|
|
||||||
RW_PROFILE_END();
|
|
||||||
|
|
||||||
getState()->swapInputState();
|
|
||||||
|
|
||||||
accumulatedTime -= deltaTime;
|
|
||||||
}
|
|
||||||
RW_PROFILE_END();
|
|
||||||
}
|
|
||||||
|
|
||||||
RW_PROFILE_BEGIN("Render");
|
|
||||||
RW_PROFILE_BEGIN("engine");
|
|
||||||
render(1, frameTime);
|
|
||||||
RW_PROFILE_END();
|
|
||||||
|
|
||||||
RW_PROFILE_BEGIN("state");
|
|
||||||
if (StateManager::currentState()) {
|
|
||||||
StateManager::get().draw(&renderer);
|
|
||||||
}
|
|
||||||
RW_PROFILE_END();
|
|
||||||
RW_PROFILE_END();
|
|
||||||
|
|
||||||
renderProfile();
|
|
||||||
|
|
||||||
getWindow().swap();
|
|
||||||
|
|
||||||
// Make sure the topmost state is the correct state
|
|
||||||
StateManager::get().updateStack();
|
|
||||||
}
|
|
||||||
|
|
||||||
window.close();
|
|
||||||
|
|
||||||
StateManager::get().clear();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RWGame::tick(float dt) {
|
void RWGame::tick(float dt) {
|
||||||
@ -572,6 +569,9 @@ void RWGame::tick(float dt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RWGame::render(float alpha, float time) {
|
void RWGame::render(float alpha, float time) {
|
||||||
|
RW_PROFILE_BEGIN("Render");
|
||||||
|
RW_PROFILE_BEGIN("engine");
|
||||||
|
|
||||||
lastDraws = getRenderer().getRenderer()->getDrawCount();
|
lastDraws = getRenderer().getRenderer()->getDrawCount();
|
||||||
|
|
||||||
getRenderer().getRenderer()->swap();
|
getRenderer().getRenderer()->swap();
|
||||||
@ -606,6 +606,22 @@ void RWGame::render(float alpha, float time) {
|
|||||||
|
|
||||||
renderer.getRenderer()->popDebugGroup();
|
renderer.getRenderer()->popDebugGroup();
|
||||||
|
|
||||||
|
renderDebugView(time, viewCam);
|
||||||
|
|
||||||
|
if (!world->isPaused()) drawOnScreenText(world.get(), &renderer);
|
||||||
|
RW_PROFILE_END();
|
||||||
|
|
||||||
|
RW_PROFILE_BEGIN("state");
|
||||||
|
if (StateManager::currentState()) {
|
||||||
|
StateManager::get().draw(&renderer);
|
||||||
|
}
|
||||||
|
RW_PROFILE_END();
|
||||||
|
RW_PROFILE_END();
|
||||||
|
|
||||||
|
renderProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RWGame::renderDebugView(float time, ViewCamera &viewCam) {
|
||||||
RW_PROFILE_BEGIN("debug");
|
RW_PROFILE_BEGIN("debug");
|
||||||
switch (debugview_) {
|
switch (debugview_) {
|
||||||
case DebugViewMode::General:
|
case DebugViewMode::General:
|
||||||
@ -625,8 +641,6 @@ void RWGame::render(float alpha, float time) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
RW_PROFILE_END();
|
RW_PROFILE_END();
|
||||||
|
|
||||||
if (!world->isPaused()) drawOnScreenText(world.get(), &renderer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RWGame::renderDebugStats(float time) {
|
void RWGame::renderDebugStats(float time) {
|
||||||
|
@ -132,6 +132,12 @@ private:
|
|||||||
void handleCheatInput(char symbol);
|
void handleCheatInput(char symbol);
|
||||||
|
|
||||||
void globalKeyEvent(const SDL_Event& event);
|
void globalKeyEvent(const SDL_Event& event);
|
||||||
|
|
||||||
|
bool updateInput();
|
||||||
|
|
||||||
|
float tickWorld(const float deltaTime, float accumulatedTime);
|
||||||
|
|
||||||
|
void renderDebugView(float time, ViewCamera &viewCam);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user