From 7f97bdae155fde06fe5d429b8f5c74ab2b373c98 Mon Sep 17 00:00:00 2001 From: Joey Pollack Date: Mon, 15 Aug 2022 13:32:54 -0400 Subject: [PATCH] Stress testing with math on the CPU --- docs/tasks/refactoring.todo | 16 ++++++- scripts/build.bat | 4 +- src/core/core.cpp | 5 ++ src/core/core.h | 1 + .../testbed/scenes/simple_render_scene.cpp | 46 ++++++++++++++----- .../testbed/scenes/simple_render_scene.h | 9 +++- 6 files changed, 66 insertions(+), 15 deletions(-) diff --git a/docs/tasks/refactoring.todo b/docs/tasks/refactoring.todo index 5ab4b74..ee32943 100644 --- a/docs/tasks/refactoring.todo +++ b/docs/tasks/refactoring.todo @@ -1,5 +1,17 @@ ☐ Create base classes for serializeable objects - ☐ JSON serializeable - ☐ Binary serializeable \ No newline at end of file + ✔ JSON serializeable @done(22-08-12 19:19) + ☐ Binary serializeable + +Renderer rewrite: + ✔ Batch rendering minimally working @done(22-08-12 19:19) + ☐ See if it's possible/better to move the matrix math into the shaders @high + ☐ Textures in batch renderer @high + ☐ DrawSprite method + ☐ Sprite shader + ☐ Text Renderer + ☐ DrawElipse @low + ☐ Elipse Shader + ☐ Elipse Batch data + \ No newline at end of file diff --git a/scripts/build.bat b/scripts/build.bat index 30a6238..cb9f84b 100644 --- a/scripts/build.bat +++ b/scripts/build.bat @@ -30,7 +30,9 @@ IF NOT "!BUILD_ERRORLEVEL!"=="0" ( EXIT /B !BUILD_ERRORLEVEL! ) -xcopy /y test_data\engine_state.xml build\Release\ +xcopy /y test_data\engine_state.json build\Release\ +xcopy /y src\renderer\shaders\* build\Release\* + ) ELSE ( cmake --build build/ --target ALL_BUILD --config Debug diff --git a/src/core/core.cpp b/src/core/core.cpp index af31c74..4bfc057 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -342,6 +342,11 @@ namespace lunarium } } + const FrameData& Core::GetFrameData() const + { + return mFrameCounter.GetFrameData(); + } + //////////////////////////////////////////////////////////// // STATIC INTERFACE //////////////////////////////////////////////////////////// diff --git a/src/core/core.h b/src/core/core.h index e081a64..4553a16 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -40,6 +40,7 @@ namespace lunarium bool IsInit() const; const State& GetState() const; + const FrameData& GetFrameData() const; void ApplyState(State newState); diff --git a/src/run_modes/testbed/scenes/simple_render_scene.cpp b/src/run_modes/testbed/scenes/simple_render_scene.cpp index b5fd776..d79e287 100644 --- a/src/run_modes/testbed/scenes/simple_render_scene.cpp +++ b/src/run_modes/testbed/scenes/simple_render_scene.cpp @@ -24,7 +24,7 @@ namespace lunarium { SimpleRenderScene::SimpleRenderScene(uint32_t logCat) - : BaseScene(logCat) + : BaseScene(logCat), mStressTest(true), mFrameTime(0.0), mNumFrames(0) { srand((u32)time(0)); } @@ -142,6 +142,11 @@ namespace lunarium angle -= 0.1f; } + if (Core::Input().IsKeyPressed(KeyCode::TAB)) + { + mStressTest = !mStressTest; + } + if (Core::Input().IsKeyPressed(KeyCode::Q)) { // Test writing out a rendered image with transparency @@ -160,17 +165,20 @@ namespace lunarium Logger::Info(mLogCat, "Running transparent image test"); g.DrawQuad(Rectangle(500, 400, 300, 300), Color(0.5f, 0.0f, 0.75f, 1.0f)); + g.DrawQuad(Rectangle(200, 300, 100, 100), Color(0.2f, 0.5f, 0.4f, 1.0f), nullptr, 45.0f); g.DrawString("This is a test of rendering an image with transparency", Rectangle::MakeFromTopLeft(50, 50, 600, 200), Color(0.0f, 1.0f, 0.2f, 1.0f), 0.5f); g.EndDraw(); mpRenderedImage = mFrameBufferTwo->GetTexture(); + mFrameBufferTwo->Unbind(); //mpRenderedImage = Core::GetInstance().EndRenderToTexture(); g.SetClearColor(prev); stbi_flip_vertically_on_write(1); stbi_write_png("lunarium_test_image.png", mpRenderedImage->GetWidth(), mpRenderedImage->GetHeight(), 4, mpRenderedImage->GetPixels(), mpRenderedImage->GetWidth() * 4); + //Logger::Info(mLogCat, "") } mImageSize.Width = Math::ClampI(mImageSize.Width, 320, 1280); @@ -202,16 +210,26 @@ namespace lunarium int w, h; Core::MainWindow().GetFramebufferSize(&w, &h); OrthographicCamera main_cam(Vec2f { 0.0f, 0.0f }, Sizef { (float)w, (float)h }); + Core::GUI().NewFrame(); + mTimer.Reset(); Core::Graphics().BeginDraw(&main_cam); - RenderScene(Core::Graphics()); - Core::GUI().NewFrame(); + if (mStressTest) + { + RenderBatchStressTest(Core::Graphics()); + } + else + { + RenderScene(Core::Graphics()); + } - DrawStatsGUI(); + Core::Graphics().EndDraw(); // Graphics end draw must happen before GUI end frame + DrawStatsGUI(); Core::GUI().EndFrame(); - Core::Graphics().EndDraw(); Core::MainWindow().SwapBuffers(); + mFrameTime += mTimer.GetElapsedSeconds(); + mNumFrames++; mRenderStats = Core::Graphics().GetFrameStats(); Core::Graphics().ResetFrameStats(); } @@ -230,10 +248,6 @@ namespace lunarium // g.DrawQuad(Rectangle(800, 500, 100.0f, 100.0f), Color(0.75f, 0.5f, 0.425f), nullptr, 90.0f); // g.DrawQuad(Rectangle(300, 400, 64.0f, 64.0f), Color(0.25f, 0.5f, 1.0f, 1.0f), nullptr, box_angle * -1); - for (int i = 0; i < NUM_QUADS; i++) - { - g.DrawQuad(mQuads[i], mQuadColors[i], nullptr, box_angle + (i % 360)); - } //g.DrawQuads(mQuads, NUM_QUADS, mQuadColors); @@ -247,10 +261,19 @@ namespace lunarium // g->DrawImage(*mpTestImageLoad, src, // dest, Color(1.0f, 1.0f, 1.0f, 0.8f)); } + + void SimpleRenderScene::RenderBatchStressTest(Renderer2D& g) + { + for (int i = 0; i < NUM_QUADS; i++) + { + g.DrawQuad(mQuads[i], mQuadColors[i], nullptr, box_angle + (i / 10.0f)); + } + } void SimpleRenderScene::DrawStatsGUI() { + ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ImVec2(400, 300)); ImGui::Begin("RENDER INFO"); ImGui::BeginChild("Per Frame", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 3.5f), true); @@ -259,10 +282,11 @@ namespace lunarium ImGui::Text("Number of triangles: %d", mRenderStats.NumTris); ImGui::Text("Draw calls: %d", mRenderStats.DrawCalls); ImGui::EndChild(); - ImGui::BeginChild("General", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 2.5f), true); + ImGui::BeginChild("General", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 3.5f), true); ImGui::Text("General Info"); ImGui::Separator(); - ImGui::Text("General render info..."); + ImGui::Text("Average Render time: %f", mFrameTime/ mNumFrames); + ImGui::Text("FPS: %d", Core::GetInstance().GetFrameData().CurrentFPS); ImGui::EndChild(); ImGui::End(); } diff --git a/src/run_modes/testbed/scenes/simple_render_scene.h b/src/run_modes/testbed/scenes/simple_render_scene.h index c83cb59..77a38c2 100644 --- a/src/run_modes/testbed/scenes/simple_render_scene.h +++ b/src/run_modes/testbed/scenes/simple_render_scene.h @@ -12,6 +12,7 @@ #include "base_scene.h" #include #include +#include #include namespace lunarium @@ -26,6 +27,7 @@ namespace lunarium virtual void OnLoad(); virtual void OnTick(double delta); void RenderScene(Renderer2D& g); + void RenderBatchStressTest(Renderer2D& g); private: @@ -41,9 +43,14 @@ namespace lunarium float mSrcWidth; float mSrcHeight; + HighResTimer mTimer; + double mFrameTime; + i64 mNumFrames; Renderer2D::FrameStats mRenderStats; - const int NUM_QUADS = 5000; + bool mStressTest; + + const int NUM_QUADS = 50000; Color* mQuadColors; Rectangle* mQuads;