From ce1a6ce9a4816ba2590a47a9692c715018bb1f32 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Sun, 8 Jul 2018 14:00:30 +0200 Subject: [PATCH] Tweaked shadow map cascades and adaptively send the program to sleep to reach a specfied refresh rate --- src/RuntimeModuleManager.h | 1 + src/main.cc | 6 +++++- src/modules/RenderModule.cc | 9 ++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/RuntimeModuleManager.h b/src/RuntimeModuleManager.h index ce9051b..c0b69af 100644 --- a/src/RuntimeModuleManager.h +++ b/src/RuntimeModuleManager.h @@ -23,6 +23,7 @@ struct RuntimeModule { struct RuntimeModuleManager { std::vector mModules; int mNumUpdatesSinceLastModuleChange = 0; + int mTargetFPS = 30; void RegisterModule(const char* name); void UnregisterModules(); diff --git a/src/main.cc b/src/main.cc index c240e58..f8bc9f0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -231,7 +231,11 @@ int main(void) ImGui::Render(); - usleep(16000); + // Send the application to sleep if we have some time left for this frame + double frame_target_time = 1.0 / module_manager.mTargetFPS; + if (frame_delta_time < frame_target_time) { + usleep ((frame_target_time - frame_delta_time) * 1000000 * 0.98); + } if (glfwGetKey(gWindow, GLFW_KEY_F5) == GLFW_PRESS) { gFileModificationObserver->Update(); diff --git a/src/modules/RenderModule.cc b/src/modules/RenderModule.cc index c4217f9..21a8b9c 100644 --- a/src/modules/RenderModule.cc +++ b/src/modules/RenderModule.cc @@ -280,7 +280,10 @@ void Light::UpdateSplits(const Camera& camera) { assert(camera.mIsOrthographic == false); float near = camera.mNear; - float far = camera.mFar; + // Clamp the far plane of the camera so that we only + // create shadow maps for things that are relatively near + // the camera. + float far = fmin(camera.mFar, 10.0f); float length = far - near; float split_near = near; float aspect = camera.mWidth / camera.mHeight; @@ -296,8 +299,8 @@ void Light::UpdateSplits(const Camera& camera) { Matrix44f light_matrix_inv = light_matrix.inverse(); mShadowSplits[0] = near; - mShadowSplits[1] = near + length * 0.02; - mShadowSplits[2] = near + length * 0.2; + mShadowSplits[1] = near + length * 0.1; + mShadowSplits[2] = near + length * 0.25; mShadowSplits[3] = far; for (int i = 0; i < cNumSplits; ++i) {