Stress testing with math on the CPU

master
Joey Pollack 3 years ago
parent 223c7a9468
commit 7f97bdae15

@ -1,5 +1,17 @@
☐ Create base classes for serializeable objects ☐ Create base classes for serializeable objects
☐ JSON serializeable ✔ JSON serializeable @done(22-08-12 19:19)
☐ Binary serializeable ☐ 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

@ -30,7 +30,9 @@ IF NOT "!BUILD_ERRORLEVEL!"=="0" (
EXIT /B !BUILD_ERRORLEVEL! 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 ( ) ELSE (
cmake --build build/ --target ALL_BUILD --config Debug cmake --build build/ --target ALL_BUILD --config Debug

@ -342,6 +342,11 @@ namespace lunarium
} }
} }
const FrameData& Core::GetFrameData() const
{
return mFrameCounter.GetFrameData();
}
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// STATIC INTERFACE // STATIC INTERFACE
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////

@ -40,6 +40,7 @@ namespace lunarium
bool IsInit() const; bool IsInit() const;
const State& GetState() const; const State& GetState() const;
const FrameData& GetFrameData() const;
void ApplyState(State newState); void ApplyState(State newState);

@ -24,7 +24,7 @@
namespace lunarium namespace lunarium
{ {
SimpleRenderScene::SimpleRenderScene(uint32_t logCat) SimpleRenderScene::SimpleRenderScene(uint32_t logCat)
: BaseScene(logCat) : BaseScene(logCat), mStressTest(true), mFrameTime(0.0), mNumFrames(0)
{ {
srand((u32)time(0)); srand((u32)time(0));
} }
@ -142,6 +142,11 @@ namespace lunarium
angle -= 0.1f; angle -= 0.1f;
} }
if (Core::Input().IsKeyPressed(KeyCode::TAB))
{
mStressTest = !mStressTest;
}
if (Core::Input().IsKeyPressed(KeyCode::Q)) if (Core::Input().IsKeyPressed(KeyCode::Q))
{ {
// Test writing out a rendered image with transparency // Test writing out a rendered image with transparency
@ -160,17 +165,20 @@ namespace lunarium
Logger::Info(mLogCat, "Running transparent image test"); 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(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", 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); Rectangle::MakeFromTopLeft(50, 50, 600, 200), Color(0.0f, 1.0f, 0.2f, 1.0f), 0.5f);
g.EndDraw(); g.EndDraw();
mpRenderedImage = mFrameBufferTwo->GetTexture(); mpRenderedImage = mFrameBufferTwo->GetTexture();
mFrameBufferTwo->Unbind();
//mpRenderedImage = Core::GetInstance().EndRenderToTexture(); //mpRenderedImage = Core::GetInstance().EndRenderToTexture();
g.SetClearColor(prev); g.SetClearColor(prev);
stbi_flip_vertically_on_write(1); stbi_flip_vertically_on_write(1);
stbi_write_png("lunarium_test_image.png", mpRenderedImage->GetWidth(), mpRenderedImage->GetHeight(), 4, stbi_write_png("lunarium_test_image.png", mpRenderedImage->GetWidth(), mpRenderedImage->GetHeight(), 4,
mpRenderedImage->GetPixels(), mpRenderedImage->GetWidth() * 4); mpRenderedImage->GetPixels(), mpRenderedImage->GetWidth() * 4);
//Logger::Info(mLogCat, "")
} }
mImageSize.Width = Math::ClampI(mImageSize.Width, 320, 1280); mImageSize.Width = Math::ClampI(mImageSize.Width, 320, 1280);
@ -202,16 +210,26 @@ namespace lunarium
int w, h; int w, h;
Core::MainWindow().GetFramebufferSize(&w, &h); Core::MainWindow().GetFramebufferSize(&w, &h);
OrthographicCamera main_cam(Vec2f { 0.0f, 0.0f }, Sizef { (float)w, (float)h }); OrthographicCamera main_cam(Vec2f { 0.0f, 0.0f }, Sizef { (float)w, (float)h });
Core::GUI().NewFrame();
mTimer.Reset();
Core::Graphics().BeginDraw(&main_cam); Core::Graphics().BeginDraw(&main_cam);
if (mStressTest)
{
RenderBatchStressTest(Core::Graphics());
}
else
{
RenderScene(Core::Graphics()); RenderScene(Core::Graphics());
}
Core::GUI().NewFrame();
Core::Graphics().EndDraw(); // Graphics end draw must happen before GUI end frame
DrawStatsGUI(); DrawStatsGUI();
Core::GUI().EndFrame(); Core::GUI().EndFrame();
Core::Graphics().EndDraw();
Core::MainWindow().SwapBuffers(); Core::MainWindow().SwapBuffers();
mFrameTime += mTimer.GetElapsedSeconds();
mNumFrames++;
mRenderStats = Core::Graphics().GetFrameStats(); mRenderStats = Core::Graphics().GetFrameStats();
Core::Graphics().ResetFrameStats(); 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(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); // 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); //g.DrawQuads(mQuads, NUM_QUADS, mQuadColors);
@ -248,9 +262,18 @@ namespace lunarium
// dest, Color(1.0f, 1.0f, 1.0f, 0.8f)); // 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() void SimpleRenderScene::DrawStatsGUI()
{ {
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(400, 300)); ImGui::SetNextWindowSize(ImVec2(400, 300));
ImGui::Begin("RENDER INFO"); ImGui::Begin("RENDER INFO");
ImGui::BeginChild("Per Frame", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 3.5f), true); 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("Number of triangles: %d", mRenderStats.NumTris);
ImGui::Text("Draw calls: %d", mRenderStats.DrawCalls); ImGui::Text("Draw calls: %d", mRenderStats.DrawCalls);
ImGui::EndChild(); 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::Text("General Info");
ImGui::Separator(); 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::EndChild();
ImGui::End(); ImGui::End();
} }

@ -12,6 +12,7 @@
#include "base_scene.h" #include "base_scene.h"
#include <renderer/renderer2D.h> #include <renderer/renderer2D.h>
#include <core/types.h> #include <core/types.h>
#include <utils/high_resolution_timer.h>
#include <string> #include <string>
namespace lunarium namespace lunarium
@ -26,6 +27,7 @@ namespace lunarium
virtual void OnLoad(); virtual void OnLoad();
virtual void OnTick(double delta); virtual void OnTick(double delta);
void RenderScene(Renderer2D& g); void RenderScene(Renderer2D& g);
void RenderBatchStressTest(Renderer2D& g);
private: private:
@ -41,9 +43,14 @@ namespace lunarium
float mSrcWidth; float mSrcWidth;
float mSrcHeight; float mSrcHeight;
HighResTimer mTimer;
double mFrameTime;
i64 mNumFrames;
Renderer2D::FrameStats mRenderStats; Renderer2D::FrameStats mRenderStats;
const int NUM_QUADS = 5000; bool mStressTest;
const int NUM_QUADS = 50000;
Color* mQuadColors; Color* mQuadColors;
Rectangle* mQuads; Rectangle* mQuads;

Loading…
Cancel
Save