Added Profiler Exporting
This commit is contained in:
parent
9fc6c6f599
commit
84bce50ecb
81525
profile_export.json
Normal file
81525
profile_export.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,5 @@
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Renderer.cpp -o src\build\Renderer.o
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\utils\Profiler.cpp -o src\build\utils\Profiler.o
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Engine.cpp -o src\build\Engine.o
|
||||
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\Entitys\Object.o src\build\utils\EngineConfig.o src\build\utils\ExceptionHandler.o src\build\utils\FileDialog.o src\build\utils\GameObjectsList.o src\build\utils\Logging.o src\build\utils\Profiler.o src\build\utils\Shader.o src\build\utils\UID.o src\build\utils\utils.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto
|
||||
[RUN] Executed app.exe successfully.
|
||||
[ERROR] Runtime crash
|
||||
Command 'src\build\app.exe' returned non-zero exit status 3221225477.
|
||||
|
@ -39,6 +39,9 @@
|
||||
#include <windows.h>
|
||||
#include <commdlg.h>
|
||||
#include <openssl/sha.h>
|
||||
#include <fstream>
|
||||
#include <json.hpp>
|
||||
using json = nlohmann::json;
|
||||
|
||||
static std::shared_ptr<Object> selected = nullptr;
|
||||
static bool playing = false;
|
||||
@ -182,7 +185,6 @@ static ProfileNode GetAveragedFrameCopy(const ProfileNode &src)
|
||||
|
||||
void ShowProfilerTimeline()
|
||||
{
|
||||
|
||||
static ProfileNode cachedAveragedFrame;
|
||||
static double lastUpdateTime = 0.0;
|
||||
static double updateInterval = 0.25;
|
||||
@ -196,7 +198,6 @@ void ShowProfilerTimeline()
|
||||
// --- Controls ---
|
||||
if (g_engineConfig.settings.profile_enabled)
|
||||
{
|
||||
|
||||
ImGui::Checkbox("Freeze View", &freezeView);
|
||||
ImGui::SameLine();
|
||||
ImGui::SetNextItemWidth(100);
|
||||
@ -206,6 +207,24 @@ void ShowProfilerTimeline()
|
||||
|
||||
updateInterval = std::clamp(updateInterval, 0.05, 5.0);
|
||||
|
||||
// Export JSON button
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Export"))
|
||||
{
|
||||
json root = SerializeProfileNode(cachedAveragedFrame);
|
||||
std::ofstream out("profile_export.json");
|
||||
if (out.is_open())
|
||||
{
|
||||
out << root.dump(4);
|
||||
out.close();
|
||||
Logger::LogInfo("Profiler exported to profile_export.json");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::LogError("Failed to write profiler export.");
|
||||
}
|
||||
}
|
||||
|
||||
if (!freezeView && latest && (now - lastUpdateTime) >= updateInterval)
|
||||
{
|
||||
cachedAveragedFrame = GetAveragedFrameCopy(*latest);
|
||||
@ -238,6 +257,7 @@ void ShowProfilerTimeline()
|
||||
{
|
||||
ImGui::Text("Profiling Disabled.");
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
@ -309,7 +329,6 @@ void ShowColorCorrectionWindow()
|
||||
|
||||
ImGui::SeparatorText("Bloom");
|
||||
|
||||
|
||||
changed |= ImGui::Checkbox("Enable Bloom", &cc->bloom);
|
||||
changed |= ImGui::SliderFloat("Threshold", &cc->threshold, 0.0f, 2.0f, "%.2f");
|
||||
changed |= ImGui::SliderFloat("Intensity", &cc->intensity, 0.0f, 4.0f, "%.2f");
|
||||
@ -323,7 +342,6 @@ void ShowColorCorrectionWindow()
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
|
||||
void Engine::Init()
|
||||
{
|
||||
|
||||
|
@ -50,6 +50,31 @@ int Renderer::s_ClusterRows = 0;
|
||||
GLuint Renderer::bloomFBO = 0;
|
||||
GLuint Renderer::bloomTexture = 0;
|
||||
|
||||
struct CachedLightUniforms {
|
||||
std::string posName;
|
||||
std::string colorName;
|
||||
std::string intensityName;
|
||||
std::string radiusName;
|
||||
};
|
||||
|
||||
std::vector<CachedLightUniforms> s_LightUniforms;
|
||||
|
||||
void InitLightUniforms(int maxLights) {
|
||||
s_LightUniforms.clear();
|
||||
s_LightUniforms.reserve(maxLights);
|
||||
for (int i = 0; i < maxLights; ++i) {
|
||||
s_LightUniforms.push_back({
|
||||
"uLightPos[" + std::to_string(i) + "]",
|
||||
"uLightColor[" + std::to_string(i) + "]",
|
||||
"uLightIntensity[" + std::to_string(i) + "]",
|
||||
"uLightRadius[" + std::to_string(i) + "]"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Renderer::InitQuad()
|
||||
{
|
||||
float vertices[] = {
|
||||
@ -112,6 +137,11 @@ void Renderer::Init()
|
||||
|
||||
SetColorCorrection(std::make_unique<ColorCorrection>());
|
||||
|
||||
{
|
||||
Logger::LogVerbose("Renderer::InitLightUniforms(%d)", g_engineConfig.gl_maxLight);
|
||||
InitLightUniforms(g_engineConfig.gl_maxLight);
|
||||
}
|
||||
|
||||
glGenBuffers(1, &s_ClusterSSBO);
|
||||
|
||||
// Bloom textures and framebuffers
|
||||
@ -405,23 +435,28 @@ void Renderer::DrawSprite(SpriteComponent *sprite, const glm::vec2 &pos, float z
|
||||
PROFILE_DEEP_SCOPE("ColorCorrection");
|
||||
s_ColorCorrection->Upload(*shader);
|
||||
}
|
||||
|
||||
shader->SetInt("uLightCount", static_cast<int>(s_Lights.size()));
|
||||
shader->SetInt("uClusterWidth", CLUSTER_SIZE);
|
||||
shader->SetInt("uClusterHeight", CLUSTER_SIZE);
|
||||
shader->SetInt("uClusterCols", s_ClusterCols);
|
||||
shader->SetInt("uMaxLightsPerCluster", MAX_LIGHTS_PER_CLUSTER);
|
||||
|
||||
for (size_t i = 0; i < s_Lights.size(); ++i)
|
||||
{
|
||||
PROFILE_DEEP_SCOPE("SetLightParams");
|
||||
|
||||
shader->SetInt("uLightCount", static_cast<int>(s_Lights.size()));
|
||||
shader->SetInt("uClusterWidth", CLUSTER_SIZE);
|
||||
shader->SetInt("uClusterHeight", CLUSTER_SIZE);
|
||||
shader->SetInt("uClusterCols", s_ClusterCols);
|
||||
shader->SetInt("uMaxLightsPerCluster", MAX_LIGHTS_PER_CLUSTER);
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < s_Lights.size(); ++i) {
|
||||
PROFILE_DEEP_SCOPE(("L" + std::to_string(i)).c_str());
|
||||
|
||||
shader->SetVec2(("uLightPos[" + std::to_string(i) + "]").c_str(), s_Lights[i].screenPos);
|
||||
shader->SetVec3(("uLightColor[" + std::to_string(i) + "]").c_str(), s_Lights[i].color);
|
||||
shader->SetFloat(("uLightIntensity[" + std::to_string(i) + "]").c_str(), s_Lights[i].intensity);
|
||||
shader->SetFloat(("uLightRadius[" + std::to_string(i) + "]").c_str(), s_Lights[i].radius);
|
||||
const auto& u = s_LightUniforms[i];
|
||||
shader->SetVec2(u.posName.c_str(), s_Lights[i].screenPos);
|
||||
shader->SetVec3(u.colorName.c_str(), s_Lights[i].color);
|
||||
shader->SetFloat(u.intensityName.c_str(), s_Lights[i].intensity);
|
||||
shader->SetFloat(u.radiusName.c_str(), s_Lights[i].radius);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
PROFILE_DEEP_SCOPE("BindNorm");
|
||||
shader->SetInt("uNormalMap", 1);
|
||||
@ -563,12 +598,9 @@ void Renderer::DrawGizmoCircle(
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
GLuint Renderer::GetFinalTexture()
|
||||
{
|
||||
PROFILE_SCOPE("Renderer::GetFinalTexture");
|
||||
PROFILE_ENGINE_SCOPE("Renderer::GetFinalTexture");
|
||||
|
||||
GLuint sceneTex = GetRenderTexture();
|
||||
|
||||
@ -630,8 +662,6 @@ GLuint Renderer::GetFinalTexture()
|
||||
return bloomTexture;
|
||||
}
|
||||
|
||||
|
||||
|
||||
GLuint Renderer::GetRenderTexture()
|
||||
{
|
||||
return textureColorBuffer;
|
||||
|
@ -1,6 +1,12 @@
|
||||
#include "Profiler.h"
|
||||
#include <cmath>
|
||||
|
||||
#include <fstream>
|
||||
#include <json.hpp>
|
||||
using json = nlohmann::json;
|
||||
|
||||
|
||||
|
||||
extern float g_fps;
|
||||
extern EngineConfig g_engineConfig;
|
||||
|
||||
@ -115,4 +121,21 @@ const ProfileNode* HierarchicalProfiler::GetLatestFrame() const {
|
||||
return frameHistory.empty() ? nullptr : &frameHistory.back();
|
||||
}
|
||||
|
||||
json SerializeProfileNode(const ProfileNode& node) {
|
||||
json j;
|
||||
j["name"] = node.name;
|
||||
j["startMs"] = node.startMs;
|
||||
j["durationMs"] = node.durationMs;
|
||||
j["visualStartMs"] = node.visualStartMs;
|
||||
j["visualDurationMs"] = node.visualDurationMs;
|
||||
|
||||
for (const auto& child : node.children) {
|
||||
j["children"].push_back(SerializeProfileNode(child));
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
HierarchicalProfiler profiler;
|
||||
|
@ -4,6 +4,11 @@
|
||||
#include <chrono>
|
||||
#include "EngineConfig.h"
|
||||
|
||||
|
||||
#include <json.hpp>
|
||||
using json = nlohmann::json;
|
||||
|
||||
|
||||
struct ProfileNode {
|
||||
std::string name;
|
||||
double startMs = 0.0;
|
||||
@ -48,6 +53,8 @@ private:
|
||||
size_t ProfilesLastFrame = 128;
|
||||
};
|
||||
|
||||
json SerializeProfileNode(const ProfileNode& node);
|
||||
|
||||
extern HierarchicalProfiler profiler;
|
||||
|
||||
struct ScopedProfile {
|
||||
|
25530
src/vendor/json.hpp
vendored
Normal file
25530
src/vendor/json.hpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user