diff --git a/.gitignore b/.gitignore index c03c3d0..4b5bb26 100644 --- a/.gitignore +++ b/.gitignore @@ -1951,3 +1951,109 @@ latex/fonts/__MACOSX/PW_Adagio_Slab_WEBFONTS/._specimen_files latex/fonts/__MACOSX/PW_Adagio_Slab_WEBFONTS/._stylesheet.css latex/fonts/__MACOSX/PW_Adagio_Slab_WEBFONTS/specimen_files/._grid_12-825-55-15.css latex/fonts/__MACOSX/PW_Adagio_Slab_WEBFONTS/specimen_files/._specimen_stylesheet.css +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-09A50442CA3D48629B1A6A10912F4C54/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-0BAF743EB76349188E87B165E23C1595/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C3C1D98063C64AA9BB038BAC13F11BDD/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini +data/nsight/unity/unity_phase1_0s_gpu_metrics.csv +data/nsight/unity/unity_phase1_0s_osrt_osrt_sum.csv +data/nsight/unity/unity_phase1_0s_vulkan_api_vulkan_api_sum.csv +data/nsight/unity/unity_phase2_30s_gpu_metrics.csv +data/nsight/unity/unity_phase2_30s_osrt_osrt_sum.csv +data/nsight/unity/unity_phase2_30s_vulkan_api_vulkan_api_sum.csv +data/nsight/unity/unity_phase3_60s_gpu_metrics.csv +data/nsight/unity/unity_phase3_60s_osrt_osrt_sum.csv +data/nsight/unity/unity_phase3_60s_vulkan_api_vulkan_api_sum.csv +data/nsight/unreal/unreal_phase1_0s_gpu_metrics.csv +data/nsight/unreal/unreal_phase1_0s_osrt_osrt_sum.csv +data/nsight/unreal/unreal_phase1_0s_vulkan_api_vulkan_api_sum.csv +data/nsight/unreal/unreal_phase2_30s_gpu_metrics.csv +data/nsight/unreal/unreal_phase2_30s_osrt_osrt_sum.csv +data/nsight/unreal/unreal_phase2_30s_vulkan_api_vulkan_api_sum.csv +data/nsight/unreal/unreal_phase3_60s_gpu_metrics.csv +data/nsight/unreal/unreal_phase3_60s_osrt_osrt_sum.csv +data/nsight/unreal/unreal_phase3_60s_vulkan_api_vulkan_api_sum.csv +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini +games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B10B54458194B598589C0DBEAEE548A/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-3B9CD6488D1B47358117812B18D512C3/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-44930D7022EC443EBC88BFDE174C8113/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-6B40E10C686C43BB8A70B405091F29D0/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-700A4B6F95BF45FC81BBFFBEE3D412AF/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-7B7EFBE4B6FF4EEAB11880B6D8A356EA/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8247E39095654FAB9019D8BA495AFFD0/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-8FC703D2CC8D4E8A8B04492B006EA40E/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9BAC35DA3C994B92B5DC827AB02311DA/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-9F73F56C24B7472C918C281F2CF74E74/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-B6CE039561DD409C93794CEDE7FC22B5/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-BAB6696806654B0E990E8A0910C33BD0/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-C88D873829C34E7D987B9D60D6616FEF/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-D2FF711549C24D84A462331F12A9B5BE/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-DB89044B227F4C399200C921601C3E46/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FADD9F04A90C410CB79783BFCA90A515/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini b/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini deleted file mode 100644 index fb34d79..0000000 --- a/games/unreal/BulletHellGame/BulletHellCPP/Linux/BulletHellCPP/Saved/Config/CrashReportClient/UECC-Linux-FECA3347009644AEBA22F337CEDFE2FD/CrashReportClient.ini +++ /dev/null @@ -1,8 +0,0 @@ -[CrashReportClient] -bHideLogFilesOption=false -bIsAllowedToCloseWithoutSending=true -CrashConfigPurgeDays=2 -Stall.RecordDump=false -Ensure.RecordDump=true -bAgreeToCrashUpload=false - diff --git a/latex/main.pdf b/latex/main.pdf index 08b03f8..4a5fe1c 100644 Binary files a/latex/main.pdf and b/latex/main.pdf differ diff --git a/latex/main.tex b/latex/main.tex index 28d0374..0347d66 100644 --- a/latex/main.tex +++ b/latex/main.tex @@ -140,7 +140,7 @@ Game development, Frame time, Engine architecture, Version control, GPU \input{tex/wywiady-analiza} \input{tex/implementacja-gry} % Analiza wywiadów z deweloperami gier \input{tex/narzedzia-profilowania} % Narzędzia profilowania wydajności -% \input{tex/5-testy-wydajnosci} % Testy wydajności +\input{tex/5-testy-wydajnosci} % Testy wydajności % \input{tex/6-analiza-mozliwosci} % Analiza możliwości i funkcjonalności % \input{tex/7-porownanie-wynikow} % Porównanie wyników i analiza % \input{tex/8-podsumowanie} diff --git a/latex/tex/5-testy-wydajnosci.tex b/latex/tex/5-testy-wydajnosci.tex index 2fc8435..e451a04 100644 --- a/latex/tex/5-testy-wydajnosci.tex +++ b/latex/tex/5-testy-wydajnosci.tex @@ -449,25 +449,27 @@ Każda faza była uruchamiana z flagą \texttt{--start-time=N}, która przesuwa spawnu przeciwników \\ (w \texttt{STGEnemySpawner}) do odpowiedniej sekundy. \\ Grę skompilowano w konfiguracji DebugGame, która zachowuje symbole debugowania przy częściowych optymalizacjach. -\subsubsection{Ograniczenia metodologiczne profilowania Unreal Engine} +\subsubsection{Metodologia profilowania fazowego} -Podczas prób profilowania silnika Unreal Engine 5.5 napotkano istotne ograniczenie techniczne: \textbf{śledzenie wywołań Vulkan API powoduje awarię} -(ang. \textit{crash}) skompilowanej gry zarówno w konfiguracji Shipping, jak i DebugGame. Problem ten występuje przy uruchomieniu z -parametrem \texttt{--trace=vulkan} narzędzia Nsight Systems i objawia się błędem segmentacji (\textit{segmentation fault}) krótko po starcie aplikacji. - -Przyczyna tego zachowania prawdopodobnie wynika z interakcji między mechanizmem instrumentacji Nsight a kodem Unreal Engine, która uniemożliwia -bezpieczne przechwytywanie wywołań Vulkan. - -W związku z tym ograniczeniem, profilowanie Unreal Engine przeprowadzono z wykorzystaniem: +Ze względu na bardzo dużą ilość danych generowanych przez Unreal Engine podczas śledzenia wywołań Vulkan API (około 13 milionów zdarzeń +na 30 sekund rozgrywki, w porównaniu z 0,5 miliona dla Unity), 90-sekundową rozgrywkę podzielono na \textbf{trzy fazy po 30 sekund każda}: \begin{itemize} - \item \textbf{Metryk sprzętowych GPU} (\texttt{--gpu-metrics-devices=0}) -- bezpośrednie - \\ próbkowanie liczników wydajności karty graficznej NVIDIA z częstotliwością 10\,000 Hz - \item \textbf{Śledzenia wywołań systemowych} (\texttt{--trace=osrt}) -- przechwytywanie funkcji OS Runtime (pthread, futex, poll itp.) + \item \textbf{Faza 1} (0--30 s): Początkowa rozgrywka z niską trudnością + \item \textbf{Faza 2} (30--60 s): Środkowa rozgrywka ze średnią trudnością + \item \textbf{Faza 3} (60--90 s): Końcowa rozgrywka z wysoką trudnością + ekran zwycięstwa \end{itemize} -Konsekwencją tego ograniczenia jest \textbf{brak bezpośrednich danych o czasach klatek} i liczbie wyrenderowanych klatek dla Unreal Engine. -Analiza porównawcza musi zatem opierać się na metrykach wykorzystania GPU i wzorcach wywołań systemowych, które dostarczają pośrednich informacji o -wydajności renderowania. +Każda faza była uruchamiana z flagą \texttt{--start-time=N}, która przesuwa zarówno stan gry +(w \texttt{STGGameDirector}), jak i poziom trudności spawnu \\ przeciwników (w \texttt{STGEnemySpawner}) +do odpowiedniej sekundy. +\\ Grę skompilowano w konfiguracji DebugGame, która zachowuje symbole debugowania przy częściowych optymalizacjach. + +Profilowanie przeprowadzono z wykorzystaniem tych samych metryk co dla Unity: +\begin{itemize} + \item \textbf{Śledzenia wywołań Vulkan API} (\texttt{--trace=vulkan}) -- przechwytywanie \\ wszystkich funkcji Vulkan + \item \textbf{Śledzenia wywołań systemowych} (\texttt{--trace=osrt}) -- przechwytywanie funkcji OS Runtime + \item \textbf{Metryk sprzętowych GPU} (\texttt{--gpu-metrics-devices=0}) -- próbkowanie \\ liczników wydajności GPU +\end{itemize} \subsubsection{Metryki wykorzystania GPU} @@ -635,8 +637,8 @@ Dane podzielone na trzy fazy (0--30s, 30--60s, 60--90s) umożliwiają szczegół \hline \textbf{Metryka} & \textbf{Faza 1 (0--30s)} & \textbf{Faza 2 (30--60s)} & \textbf{Faza 3 (60--90s)} \\ \hline -Liczba klatek (vkQueuePresentKHR) & 10\,286 & 11\,531 & 4\,590 \\ -Średni FPS & 343 & 384 & 153 \\ +Liczba klatek (vkQueuePresentKHR) & 9\,964 & 10\,165 & 4\,846 \\ +Średni FPS & 332 & 339 & 162 \\ vkCreateComputePipelines & 231 & 233 & 231 \\ vkCreateGraphicsPipelines & 793 & 797 & 816 \\ vkQueueSubmit & 166\,918 & 186\,589 & 74\,393 \\ @@ -650,18 +652,15 @@ vkCmdBindPipeline & 2\,236\,013 & 2\,528\,014 & 1\,007\,615 \\ Tabela~\ref{tab:unreal-vulkan-phases} ujawnia znaczącą dynamikę wydajności między fazami. Fazy 1 i 2 (aktywna rozgrywka) osiągają wysoką wydajność -(343--384 FPS), natomiast faza 3 pokazuje \textbf{dramatyczny spadek do 153 FPS} -- redukcję o -ponad 60\%. Spadek ten występuje w końcowej fazie +(332--339 FPS), natomiast faza 3 pokazuje \textbf{znaczący spadek do 162 FPS} -- redukcję o +ponad 50\%. Spadek ten występuje w końcowej fazie rozgrywki, gdy na ekranie znajduje się największa liczba przeciwników i pocisków, co stanowi najbardziej wymagający moment dla silnika renderującego. Dodatkowo faza 3 zawiera ekran zwycięstwa, który również wpływa na średnią wydajność. -\textbf{Uwaga metodologiczna:} W przeciwieństwie do Unity, dla Unreal Engine nie dysponujemy danymi o -rozkładzie percentylowym czasów klatek -(1\% low, 0.1\% low), ponieważ śledzenie Vulkan API powoduje awarię aplikacji. Średnie wartości FPS -mogą być zawyżone przez początkowe klatki -o niskim obciążeniu, dlatego wartość 153 FPS z fazy 3 lepiej reprezentuje wydajność w wymagających -scenach niż średnia z faz 1--2. +\textbf{Uwaga metodologiczna:} Wartość 162 FPS z fazy 3 lepiej reprezentuje wydajność w wymagających +scenach niż średnie z faz 1--2, ponieważ faza 3 zawiera moment największego obciążenia gry +(maksymalna liczba przeciwników i pocisków na ekranie). Stosunek wywołań \texttt{vkQueueSubmit} do \texttt{vkQueuePresentKHR} pozostaje stabilny na poziomie \textbf{16,2:1} we wszystkich fazach, co wskazuje na konsystentną architekturę potoku renderowania niezależną od obciążenia sceny. @@ -957,18 +956,11 @@ Porównanie faz 1 i 2 (tabela~\ref{tab:unreal-gpu-phases}) pokazuje niezwykłą Ta konsystencja potwierdza poprawność metodologii fazowego profilowania i sugeruje deterministyczne zachowanie silnika renderującego niezależnie od poziomu trudności gry. -\paragraph{Ograniczenia analizy} +\paragraph{Podsumowanie architektury Unreal Engine} -Brak danych o wywołaniach Vulkan API (z powodu crashu przy włączonym \texttt{--trace=vulkan}) uniemożliwia: -\begin{itemize} - \item Bezpośrednie porównanie liczby klatek i FPS z Unity - \item Analizę strategii synchronizacji fence/semaphore - \item Identyfikację konkretnych operacji renderowania - \item Ocenę efektywności batching'u i state changes -\end{itemize} - -Niemniej zebrane metryki GPU (ponad milion próbek) i wywołania systemowe (ponad 9 milionów wywołań) dostarczają wartościowego wglądu w -charakterystykę wydajnościową silnika, pozwalając na porównanie architektoniczne z Unity mimo braku bezpośrednich danych o frame time. +Dzięki profilowaniu fazowemu uzyskano kompletne dane śledzenia Vulkan API i metryk GPU dla całej 90-sekundowej rozgrywki. +Zebrane dane (ponad 32 miliony zdarzeń Vulkan API, ponad milion próbek GPU i ponad 9 milionów wywołań systemowych) dostarczają +kompleksowego wglądu w charakterystykę wydajnościową silnika, umożliwiając bezpośrednie porównanie z Unity. \subsection{Analiza porównawcza} \label{subsec:analiza-porownawcza} @@ -983,38 +975,23 @@ charakterystykę wydajnościową silnika, pozwalając na porównanie architekton \hline \textbf{Metryka} & \textbf{Unity} & \textbf{Unreal Engine} \\ \hline -Średni FPS (fazy 1--2) & 144 (V-Sync) & 343--384 \\ -Średni FPS (faza 3, wymagająca) & 144 (V-Sync) & 153 \\ -1\% low (99. percentyl) & 132 FPS & brak danych \\ -Całkowita liczba klatek (90s) & 13\,556 & 26\,407 \\ +Średni FPS (fazy 1--2) & 164 (V-Sync) & 332--339 \\ +Średni FPS (faza 3, wymagająca) & 164 (V-Sync) & 162 \\ +Całkowita liczba klatek (90s) & 14\,765 & 24\,975 \\ \hline \end{tabular} \end{table} -Tabela~\ref{tab:frame-time-comparison} przedstawia porównanie wydajności obu silników. -\textbf{Bezpośrednie porównanie średnich -wartości FPS jest jednak problematyczne} z następujących powodów: +Tabela~\ref{tab:frame-time-comparison} przedstawia porównanie wydajności obu silników. -\begin{itemize} - \item \textbf{Unity działał z włączonym V-Sync} -- wydajność była sztucznie ograniczona do - 144 FPS (częstotliwość - odświeżania monitora), co uniemożliwia ocenę rzeczywistej maksymalnej wydajności silnika - \item \textbf{Brak danych percentylowych dla Unreal} -- nie dysponujemy wartościami 1\% low - ani 0.1\% low, które - lepiej reprezentują wydajność w wymagających momentach niż średnia arytmetyczna - \item \textbf{Średnie FPS Unreal mogą być zawyżone} -- początkowe klatki o niskim obciążeniu - podnoszą średnią, - podczas gdy w fazie 3 (najbardziej wymagającej) wydajność spadła do 153 FPS -\end{itemize} +Kluczową obserwacją jest to, że \textbf{Unity działał z włączonym V-Sync} na monitorze 165 Hz, +co ograniczało wydajność do około 164 FPS niezależnie od obciążenia sceny. Unreal Engine działał +bez V-Sync, osiągając 332--339 FPS w fazach 1--2, jednak \textbf{w fazie 3 (najbardziej wymagającej) +wydajność spadła do 162 FPS} -- wartości zbliżonej do Unity. -Porównując wartości bardziej reprezentatywne dla rzeczywistej rozgrywki: \\ -\textbf{Unity 1\% low (132 FPS) vs Unreal faza 3 (153 FPS)}, -różnica wynosi zaledwie 16\%, co jest znacznie mniejsze niż sugerowałoby porównanie średnich -(144 vs 384 FPS). - -Jednoznaczne stwierdzenie, który silnik jest wydajniejszy, wymaga powtórzenia testów z -wyłączonym V-Sync dla Unity oraz -uzyskania danych percentylowych dla Unreal Engine. +Ten wynik sugeruje, że przy wysokim obciążeniu sceny (maksymalna liczba przeciwników i pocisków) +oba silniki osiągają porównywalną wydajność, natomiast Unreal Engine jest w stanie wykorzystać +zapas mocy obliczeniowej GPU przy mniejszym obciążeniu. \subsubsection{Porównanie wykorzystania GPU} @@ -1088,11 +1065,11 @@ małych zadań często komunikujących się ze sobą (ponad 3 miliony wywołań \hline \textbf{Metryka} & \textbf{Unity} & \textbf{Unreal Engine} \\ \hline -Średni FPS (fazy 1--2) & 144 (V-Sync) & 343--384 \\ -FPS w wymagającej scenie & 132 (1\% low) & 153 (faza 3) \\ -GPU Active (\%) & -- & 91 (fazy 1--2), 50 (faza 3) \\ +Średni FPS (fazy 1--2) & 164 (V-Sync) & 332--339 \\ +FPS w wymagającej scenie & 132 (1\% low) & 162 (faza 3) \\ +GPU Active (\%) & 23 & 91 (fazy 1--2), 50 (faza 3) \\ Dominujące wąskie gardło & GPU (rendering) & CPU (kompilacja potoków) \\ -Wywołania Vulkan API & 218\,815 & $\sim$15 mln \\ +Wywołania Vulkan API & $\sim$0,5 mln & $\sim$32 mln \\ Wywołania synchronizacji OS & 29\,383 & $\sim$9 mln \\ Potoki graficzne utworzone & 3 & $\sim$2\,400 \\ \hline @@ -1102,26 +1079,24 @@ Potoki graficzne utworzone & 3 & $\sim$2\,400 \\ Przeprowadzone testy wydajnościowe pozwalają na sformułowanie następujących wniosków: \begin{enumerate} - \item \textbf{Wydajność w wymagających scenach}: Porównanie to Unity - 1\% low (132 FPS) vs - Unreal faza 3 (153 FPS), gdzie różnica wynosi około 16\%. Unreal Engine wykazuje jednak - znaczący spadek wydajności - (o ponad 60\%) w końcowej fazie rozgrywki z dużą liczbą obiektów na ekranie. + \item \textbf{Wydajność w wymagających scenach}: W fazie 3 (maksymalne obciążenie) + oba silniki osiągają zbliżoną wydajność: Unity 1\% low 132 FPS vs Unreal 162 FPS. Różnica + około 23\% na korzyść Unreal wynika częściowo z różnych konfiguracji V-Sync. - \item \textbf{Stabilność}: Unity wykazał stabilne czasy klatek dzięki V-Sync, \\ natomiast - Unreal Engine pokazał - dużą zmienność między fazami (343--384 FPS w fazach 1--2 vs 153 FPS w fazie 3). + \item \textbf{Wykorzystanie GPU}: Unity wykorzystuje jedynie 23\% mocy GPU \\ (ograniczony V-Sync), + podczas gdy Unreal Engine osiąga 91\% wykorzystania w fazach 1--2. Sugeruje to znaczny + zapas wydajności Unity przy wyłączonym V-Sync. - \item \textbf{Architektura}: Silniki stosują fundamentalnie różne podejścia do \\ - wielowątkowości - i zarządzania - potokami renderowania. Unity używa gruboziarnistego paralelizmu z rzadkimi synchronizacjami, - podczas gdy Unreal - stosuje drobnoziarnisty system TaskGraph z milionami wywołań synchronizacyjnych. + \item \textbf{Stabilność}: Unity wykazał stabilne czasy klatek dzięki V-Sync, \\ natomiast + Unreal Engine pokazał dużą zmienność między fazami (332--339 FPS w fazach 1--2 vs 162 FPS + w fazie 3) -- spadek o ponad 50\%. - \item \textbf{Narzut Unreal}: Dynamiczna kompilacja potoków (ponad 1000 potoków na - 30-sekundową fazę vs 3 w całym - teście Unity) i intensywna komunikacja międzywątkowa stanowią znaczący narzut, który - może przyczyniać się do - spadków wydajności w wymagających scenach. + \item \textbf{Architektura}: Silniki stosują fundamentalnie różne podejścia do + wielowątkowości i zarządzania potokami renderowania. Unity używa gruboziarnistego paralelizmu + z rzadkimi synchronizacjami, podczas gdy Unreal stosuje drobnoziarnisty system TaskGraph + z milionami wywołań synchronizacyjnych. + + \item \textbf{Narzut Unreal}: Dynamiczna kompilacja potoków (ponad 1000 potoków na + 30-sekundową fazę vs 3 w całym teście Unity) i 60-krotnie większa liczba wywołań Vulkan API + stanowią znaczący narzut, który może przyczyniać się do spadków wydajności w wymagających scenach. \end{enumerate} diff --git a/scripts/profile.sh b/scripts/profile.sh new file mode 100755 index 0000000..8eef58a --- /dev/null +++ b/scripts/profile.sh @@ -0,0 +1,258 @@ +#!/bin/bash +# ============================================================================= +# Unified Nsight Profiling Script for Unity and Unreal Engine +# ============================================================================= +# Profiles games using NVIDIA Nsight Systems with identical metrics for both engines. +# Uses phased profiling (3 x 30 seconds) to avoid data overload crashes. +# +# Usage: +# ./profile.sh [phase] +# +# Arguments: +# engine: "unity" or "unreal" +# phase: 1, 2, 3, or "all" (default: all) +# +# Examples: +# ./profile.sh unity # Profile Unity, all phases +# ./profile.sh unreal # Profile Unreal, all phases +# ./profile.sh unreal 1 # Profile Unreal, phase 1 only +# ./profile.sh unity all # Profile Unity, all phases +# ============================================================================= + +set -e + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" + +# Game executables +UNITY_EXE="$PROJECT_DIR/magisterka_2/Final.x86_64" +UNREAL_DIR="$PROJECT_DIR/games/unreal/BulletHellGame/BulletHellCPP/Linux" +UNREAL_EXE="$UNREAL_DIR/BulletHellCPP/Binaries/Linux/BulletHellCPP-Linux-DebugGame" + +# Arguments +ENGINE="${1:-}" +PHASE="${2:-all}" + +# Colors +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +RED='\033[0;31m' +BOLD='\033[1m' +NC='\033[0m' + +# Validate engine argument +if [[ -z "$ENGINE" ]]; then + echo -e "${RED}Error: Engine argument required${NC}" + echo "" + echo "Usage: $0 [phase]" + echo " engine: 'unity' or 'unreal'" + echo " phase: 1, 2, 3, or 'all' (default: all)" + exit 1 +fi + +if [[ "$ENGINE" != "unity" && "$ENGINE" != "unreal" ]]; then + echo -e "${RED}Error: Engine must be 'unity' or 'unreal', got: $ENGINE${NC}" + exit 1 +fi + +# Set engine-specific configuration +if [[ "$ENGINE" == "unity" ]]; then + GAME_EXE="$UNITY_EXE" + GAME_ARGS="-force-vulkan --invincible --stationary" + DATA_DIR="$PROJECT_DIR/data/nsight/unity" + OUTPUT_PREFIX="unity" + WORK_DIR="$PROJECT_DIR" +else + GAME_EXE="$UNREAL_EXE" + GAME_ARGS="BulletHellCPP --invincible --stationary" + DATA_DIR="$PROJECT_DIR/data/nsight/unreal" + OUTPUT_PREFIX="unreal" + WORK_DIR="$UNREAL_DIR" +fi + +# Phase configuration +PHASE_DURATION=35 # 30s game + 5s buffer + +# Check if game exists +if [ ! -f "$GAME_EXE" ]; then + echo -e "${RED}Error: Game executable not found at $GAME_EXE${NC}" + exit 1 +fi + +# Create output directory +mkdir -p "$DATA_DIR" + +# Function to run a single phase +run_phase() { + local phase_num=$1 + local start_time=$2 + local output_name="${OUTPUT_PREFIX}_phase${phase_num}_${start_time}s" + local output_path="$DATA_DIR/$output_name" + + echo -e "${CYAN}════════════════════════════════════════════════════════════${NC}" + echo -e "${CYAN} PHASE ${phase_num}: Starting at ${start_time}s${NC}" + echo -e "${CYAN}════════════════════════════════════════════════════════════${NC}" + + # Clean up any previous processes + pkill -9 nsys 2>/dev/null || true + pkill -9 -f "$(basename "$GAME_EXE")" 2>/dev/null || true + sleep 2 + + # Clean nsight temp files + /bin/rm -rf /tmp/nvidia/nsight_systems/* 2>/dev/null || true + + echo -e "${YELLOW}Running Nsight profiler for ${PHASE_DURATION}s...${NC}" + echo -e "${YELLOW}Tracing: vulkan + osrt + GPU metrics${NC}" + + # Build game arguments with start time + local full_args="$GAME_ARGS" + if [[ "$ENGINE" == "unreal" ]]; then + full_args="$GAME_ARGS --start-time=$start_time" + fi + + # Run profiler + cd "$WORK_DIR" + nsys profile \ + --trace=vulkan,osrt \ + --gpu-metrics-devices=0 \ + --sample=none \ + --cpuctxsw=none \ + --output="$output_path" \ + --duration=$PHASE_DURATION \ + --force-overwrite=true \ + -- "$GAME_EXE" $full_args || true + + echo -e "${GREEN}✓ Phase ${phase_num} profiling complete${NC}" + + # Export data if capture succeeded + if [ -f "${output_path}.nsys-rep" ]; then + echo -e "${YELLOW}Exporting stats...${NC}" + + # Export to SQLite + nsys export --type sqlite -o "${output_path}.sqlite" "${output_path}.nsys-rep" 2>/dev/null || true + + # Export Vulkan API summary + nsys stats -r vulkan_api_sum --format csv -o "${output_path}_vulkan_api" "${output_path}.nsys-rep" 2>/dev/null || true + + # Export OS runtime summary + nsys stats -r osrt_sum --format csv -o "${output_path}_osrt" "${output_path}.nsys-rep" 2>/dev/null || true + + # Export GPU metrics if available + if [ -f "${output_path}.sqlite" ]; then + sqlite3 -header -csv "${output_path}.sqlite" " + SELECT + t.metricName, + COUNT(*) as samples, + ROUND(AVG(m.value), 2) as avg_value, + MIN(m.value) as min_value, + MAX(m.value) as max_value + FROM GPU_METRICS m + JOIN TARGET_INFO_GPU_METRICS t ON m.metricId = t.metricId + GROUP BY t.metricName + ORDER BY samples DESC; + " > "${output_path}_gpu_metrics.csv" 2>/dev/null || true + + # Get frame count from Vulkan data + FRAMES=$(sqlite3 "${output_path}.sqlite" "SELECT COUNT(*) FROM VULKAN_API WHERE nameId IN (SELECT id FROM StringIds WHERE value='vkQueuePresentKHR');" 2>/dev/null || echo "0") + FPS=$(echo "scale=2; $FRAMES / 30" | bc 2>/dev/null || echo "N/A") + + echo -e "${GREEN} Frames: ${FRAMES}, FPS: ${FPS}${NC}" + fi + + local file_size=$(ls -lh "${output_path}.nsys-rep" | awk '{print $5}') + echo -e "${GREEN}✓ Exported: ${output_name}.nsys-rep (${file_size})${NC}" + else + echo -e "${RED}✗ Phase ${phase_num} capture failed${NC}" + fi + + echo "" + sleep 3 # Cool-down between phases +} + +# Function to display summary +display_summary() { + echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════════${NC}" + echo -e "${CYAN}${BOLD} PROFILING SUMMARY ${NC}" + echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════════${NC}" + echo "" + + echo -e "${YELLOW}Engine: ${ENGINE^^}${NC}" + echo -e "${YELLOW}Output directory: ${DATA_DIR}${NC}" + echo "" + + echo -e "${YELLOW}Generated files:${NC}" + ls -la "$DATA_DIR"/${OUTPUT_PREFIX}_phase*.nsys-rep 2>/dev/null || echo " No report files found" + echo "" + + # Calculate total frames and FPS from all phases + local total_frames=0 + local phases_count=0 + + for phase in 1 2 3; do + local sqlite_file="$DATA_DIR/${OUTPUT_PREFIX}_phase${phase}_*s.sqlite" + sqlite_file=$(ls $sqlite_file 2>/dev/null | head -1) + if [ -f "$sqlite_file" ]; then + local frames=$(sqlite3 "$sqlite_file" "SELECT COUNT(*) FROM VULKAN_API WHERE nameId IN (SELECT id FROM StringIds WHERE value='vkQueuePresentKHR');" 2>/dev/null || echo "0") + echo -e " Phase $phase: ${frames} frames" + total_frames=$((total_frames + frames)) + phases_count=$((phases_count + 1)) + fi + done + + if [ $phases_count -gt 0 ]; then + local total_duration=$((phases_count * 30)) + local avg_fps=$(echo "scale=2; $total_frames / $total_duration" | bc) + echo "" + echo -e "${GREEN}Total frames: ${total_frames}${NC}" + echo -e "${GREEN}Average FPS: ${avg_fps}${NC}" + fi + + echo "" + echo -e "${GREEN}${BOLD}Done!${NC}" +} + +# Main execution +echo -e "${CYAN}${BOLD}" +echo "╔═══════════════════════════════════════════════════════════╗" +echo "║ UNIFIED NSIGHT PROFILING (${ENGINE^^}) " +echo "╚═══════════════════════════════════════════════════════════╝" +echo -e "${NC}" + +echo -e "${YELLOW}Configuration:${NC}" +echo " Engine: ${ENGINE^^}" +echo " Game: ${GAME_EXE}" +echo " Output dir: ${DATA_DIR}" +echo " Phase: ${PHASE}" +echo " Tracing: vulkan + osrt + GPU metrics" +echo "" + +case "$PHASE" in + 1) + run_phase 1 0 + display_summary + ;; + 2) + run_phase 2 30 + display_summary + ;; + 3) + run_phase 3 60 + display_summary + ;; + all) + echo -e "${CYAN}Running all 3 phases (3 x 30 seconds = 90 seconds total)${NC}" + echo "" + + run_phase 1 0 + run_phase 2 30 + run_phase 3 60 + + display_summary + ;; + *) + echo -e "${RED}Error: Phase must be 1, 2, 3, or 'all', got: $PHASE${NC}" + exit 1 + ;; +esac diff --git a/scripts/profile_unity.sh b/scripts/profile_unity.sh deleted file mode 100755 index 561602b..0000000 --- a/scripts/profile_unity.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash -# ============================================================================= -# Unity Nsight Profiling Script -# ============================================================================= -# Profiles the Unity bullet-hell game with NVIDIA Nsight Systems -# -# Usage: -# ./profile_unity.sh [duration_seconds] [output_name] -# -# Examples: -# ./profile_unity.sh # 95s profile, default name -# ./profile_unity.sh 60 # 60s profile -# ./profile_unity.sh 95 my_test # 95s profile, custom name -# ============================================================================= - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(dirname "$SCRIPT_DIR")" -DATA_DIR="$PROJECT_DIR/data/nsight" -UNITY_GAME="$PROJECT_DIR/magisterka_2/Final.x86_64" - -# Arguments -DURATION="${1:-95}" -OUTPUT_NAME="${2:-unity_$(date +%Y%m%d_%H%M%S)}" -OUTPUT_PATH="$DATA_DIR/$OUTPUT_NAME" - -# Colors -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -echo -e "${CYAN}${BOLD}" -echo "╔═══════════════════════════════════════════════════════════╗" -echo "║ UNITY NSIGHT PROFILING ║" -echo "╚═══════════════════════════════════════════════════════════╝" -echo -e "${NC}" - -echo -e "${YELLOW}Configuration:${NC}" -echo " Duration: ${DURATION}s" -echo " Output: ${OUTPUT_PATH}.nsys-rep" -echo " Game: ${UNITY_GAME}" -echo "" - -# Create output directory -mkdir -p "$DATA_DIR" - -# Step 1: Run profiler -echo -e "${CYAN}[1/4] Running Nsight profiler (${DURATION}s)...${NC}" -nsys profile \ - --output="$OUTPUT_PATH" \ - --trace=vulkan,osrt \ - --duration="$DURATION" \ - --force-overwrite=true \ - -- "$UNITY_GAME" -force-vulkan --invincible --stationary - -echo -e "${GREEN}✓ Profiling complete${NC}" -echo "" - -# Step 2: Export Vulkan API summary -echo -e "${CYAN}[2/4] Exporting Vulkan API summary...${NC}" -nsys stats -r vulkan_api_sum --format csv \ - -o "${OUTPUT_PATH}_vulkan_api_sum" \ - "${OUTPUT_PATH}.nsys-rep" 2>&1 | grep -E "PROCESSED|SKIPPED" || true -echo -e "${GREEN}✓ Vulkan summary exported${NC}" - -# Step 3: Export OS runtime summary -echo -e "${CYAN}[3/4] Exporting OS runtime summary...${NC}" -nsys stats -r osrt_sum --format csv \ - -o "${OUTPUT_PATH}_osrt_sum" \ - "${OUTPUT_PATH}.nsys-rep" 2>&1 | grep -E "PROCESSED|SKIPPED" || true -echo -e "${GREEN}✓ OS runtime summary exported${NC}" -echo "" - -# Step 4: Calculate and display results -echo -e "${CYAN}[4/4] Analyzing results...${NC}" -echo "" - -# Get frame count from SQLite -SQLITE_FILE="${OUTPUT_PATH}.sqlite" -if [ -f "$SQLITE_FILE" ]; then - FRAMES=$(sqlite3 "$SQLITE_FILE" "SELECT COUNT(*) FROM VULKAN_API WHERE nameId IN (SELECT id FROM StringIds WHERE value='vkQueuePresentKHR');" 2>/dev/null || echo "0") - FPS=$(echo "scale=2; $FRAMES / $DURATION" | bc) -else - FRAMES="N/A" - FPS="N/A" -fi - -# Get report size -REPORT_SIZE=$(ls -lh "${OUTPUT_PATH}.nsys-rep" | awk '{print $5}') - -# Display summary -echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}${BOLD} PROFILING RESULTS ${NC}" -echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════════${NC}" -echo "" -echo -e "${YELLOW}Performance Metrics:${NC}" -echo " Duration: ${DURATION} seconds" -echo " Total Frames: ${FRAMES}" -echo " Average FPS: ${FPS}" -echo "" - -echo -e "${YELLOW}Generated Files:${NC}" -echo " Report: ${OUTPUT_PATH}.nsys-rep (${REPORT_SIZE})" -echo " SQLite: ${OUTPUT_PATH}.sqlite" -ls "${OUTPUT_PATH}"*.csv 2>/dev/null | while read f; do - echo " CSV: $(basename "$f")" -done -echo "" - -# Display Vulkan API top 10 -echo -e "${YELLOW}Vulkan API Summary (Top 10 by time):${NC}" -nsys stats -r vulkan_api_sum "${OUTPUT_PATH}.nsys-rep" 2>&1 | grep -A 15 "Time (%)" | head -13 -echo "" - -echo -e "${GREEN}${BOLD}Done!${NC}" -echo "" -echo "To view full report in Nsight UI:" -echo " nsys-ui ${OUTPUT_PATH}.nsys-rep" diff --git a/scripts/profile_unreal.sh b/scripts/profile_unreal.sh deleted file mode 100755 index 90b983f..0000000 --- a/scripts/profile_unreal.sh +++ /dev/null @@ -1,230 +0,0 @@ -#!/bin/bash -# ============================================================================= -# Unreal Engine Nsight Profiling Script -# ============================================================================= -# Profiles the Unreal Engine bullet-hell game with NVIDIA Nsight Systems -# -# Supports two build configurations: -# - Shipping: osrt + GPU metrics only (Vulkan tracing crashes) -# - Development: Full Vulkan + osrt + GPU metrics -# -# Usage: -# ./profile_unreal.sh [config] [duration] [output_name] -# -# Arguments: -# config: "shipping" or "development" (default: shipping) -# duration: Test duration in seconds (default: 95) -# output_name: Custom output name (default: auto-generated) -# -# Examples: -# ./profile_unreal.sh # Shipping, 95s -# ./profile_unreal.sh development # Development with Vulkan, 95s -# ./profile_unreal.sh shipping 60 # Shipping, 60s -# ./profile_unreal.sh development 95 my_test # Development, 95s, custom name -# ============================================================================= - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(dirname "$SCRIPT_DIR")" -UNREAL_BASE="$PROJECT_DIR/games/unreal/BulletHellGame/BulletHellCPP" - -# Parse arguments -CONFIG="${1:-shipping}" -DURATION="${2:-95}" -OUTPUT_NAME_ARG="${3:-}" - -# Validate config -if [[ "$CONFIG" != "shipping" && "$CONFIG" != "development" ]]; then - echo "Error: config must be 'shipping' or 'development', got: $CONFIG" - exit 1 -fi - -# Set paths based on configuration -if [[ "$CONFIG" == "shipping" ]]; then - UNREAL_GAME="$UNREAL_BASE/Saved/StagedBuilds/Linux/BulletHellCPP.sh" - DATA_DIR="$PROJECT_DIR/data/nsight/unreal/shipping" - DEFAULT_PREFIX="unreal_shipping" - TRACE_OPTS="osrt" - TRACE_DESC="osrt + GPU metrics (Vulkan crashes Shipping builds)" -else - UNREAL_GAME="$UNREAL_BASE/Saved/StagedBuilds/LinuxDevelopment/BulletHellCPP.sh" - DATA_DIR="$PROJECT_DIR/data/nsight/unreal/development" - DEFAULT_PREFIX="unreal_dev" - TRACE_OPTS="vulkan,osrt" - TRACE_DESC="Vulkan + osrt + GPU metrics" -fi - -# Set output name -if [[ -n "$OUTPUT_NAME_ARG" ]]; then - OUTPUT_NAME="$OUTPUT_NAME_ARG" -else - OUTPUT_NAME="${DEFAULT_PREFIX}_$(date +%Y%m%d_%H%M%S)" -fi -OUTPUT_PATH="$DATA_DIR/$OUTPUT_NAME" - -# Colors -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -CYAN='\033[0;36m' -RED='\033[0;31m' -BOLD='\033[1m' -NC='\033[0m' - -echo -e "${CYAN}${BOLD}" -echo "╔═══════════════════════════════════════════════════════════╗" -echo "║ UNREAL ENGINE NSIGHT PROFILING ║" -echo "╚═══════════════════════════════════════════════════════════╝" -echo -e "${NC}" - -echo -e "${YELLOW}Configuration:${NC}" -echo " Build: ${CONFIG^^}" -echo " Duration: ${DURATION}s" -echo " Tracing: ${TRACE_DESC}" -echo " Output: ${OUTPUT_PATH}.nsys-rep" -echo " Game: ${UNREAL_GAME}" -echo "" - -# Check if game exists -if [ ! -f "$UNREAL_GAME" ]; then - echo -e "${RED}Error: Unreal game not found at $UNREAL_GAME${NC}" - echo "" - if [[ "$CONFIG" == "shipping" ]]; then - echo "Please package the game first via Unreal Editor:" - echo " 1. File → Package Project → Build Configuration → Shipping" - echo " 2. File → Package Project → Linux" - else - echo "Please package a Development build via Unreal Editor:" - echo " 1. File → Package Project → Build Configuration → Development" - echo " 2. File → Package Project → Linux" - echo "" - echo "The Development build should be saved to:" - echo " $UNREAL_BASE/Saved/StagedBuilds/LinuxDevelopment/" - fi - exit 1 -fi - -# Create output directory -mkdir -p "$DATA_DIR" - -# Step 1: Run profiler -echo -e "${CYAN}[1/4] Running Nsight profiler (${DURATION}s)...${NC}" -echo -e "${YELLOW}Tracing: ${TRACE_DESC}${NC}" -nsys profile \ - --output="$OUTPUT_PATH" \ - --trace="$TRACE_OPTS" \ - --gpu-metrics-devices=0 \ - --duration="$DURATION" \ - --force-overwrite=true \ - --wait=all \ - -- "$UNREAL_GAME" --invincible --stationary - -echo -e "${GREEN}✓ Profiling complete${NC}" -echo "" - -# Step 2: Export OS runtime summary -echo -e "${CYAN}[2/4] Exporting OS runtime summary...${NC}" -nsys stats -r osrt_sum --format csv \ - -o "${OUTPUT_PATH}" \ - "${OUTPUT_PATH}.nsys-rep" 2>&1 | grep -E "PROCESSED|SKIPPED" || true -echo -e "${GREEN}✓ OS runtime summary exported${NC}" -echo "" - -# Step 3: Export Vulkan summary (only for Development builds) -if [[ "$CONFIG" == "development" ]]; then - echo -e "${CYAN}[3/4] Exporting Vulkan API summary...${NC}" - nsys stats -r vulkan_api_sum --format csv \ - -o "${OUTPUT_PATH}" \ - "${OUTPUT_PATH}.nsys-rep" 2>&1 | grep -E "PROCESSED|SKIPPED" || true - echo -e "${GREEN}✓ Vulkan API summary exported${NC}" -else - echo -e "${CYAN}[3/4] Skipping Vulkan export (not available in Shipping)${NC}" -fi -echo "" - -# Step 4: Export GPU metrics summary -echo -e "${CYAN}[4/4] Exporting GPU metrics summary...${NC}" -SQLITE_FILE="${OUTPUT_PATH}.sqlite" -if [ -f "$SQLITE_FILE" ]; then - sqlite3 -header -csv "$SQLITE_FILE" " - SELECT - t.metricName, - COUNT(*) as samples, - ROUND(AVG(m.value), 2) as avg_value, - MIN(m.value) as min_value, - MAX(m.value) as max_value - FROM GPU_METRICS m - JOIN TARGET_INFO_GPU_METRICS t ON m.metricId = t.metricId - GROUP BY t.metricName - " > "${OUTPUT_PATH}_gpu_metrics.csv" - echo -e "${GREEN}✓ GPU metrics exported${NC}" -fi -echo "" - -# Get report size -REPORT_SIZE=$(ls -lh "${OUTPUT_PATH}.nsys-rep" | awk '{print $5}') - -# Get GPU utilization metrics -GPU_ACTIVE="N/A" -GR_ACTIVE="N/A" -SM_ACTIVE="N/A" -if [ -f "$SQLITE_FILE" ]; then - GPU_ACTIVE=$(sqlite3 "$SQLITE_FILE" "SELECT ROUND(AVG(m.value), 1) FROM GPU_METRICS m JOIN TARGET_INFO_GPU_METRICS t ON m.metricId = t.metricId WHERE t.metricName = 'GPU Active [Throughput %]';" 2>/dev/null || echo "N/A") - GR_ACTIVE=$(sqlite3 "$SQLITE_FILE" "SELECT ROUND(AVG(m.value), 1) FROM GPU_METRICS m JOIN TARGET_INFO_GPU_METRICS t ON m.metricId = t.metricId WHERE t.metricName = 'GR Active [Throughput %]';" 2>/dev/null || echo "N/A") - SM_ACTIVE=$(sqlite3 "$SQLITE_FILE" "SELECT ROUND(AVG(m.value), 1) FROM GPU_METRICS m JOIN TARGET_INFO_GPU_METRICS t ON m.metricId = t.metricId WHERE t.metricName = 'SMs Active [Throughput %]';" 2>/dev/null || echo "N/A") -fi - -# Get frame count for Development builds (Vulkan data available) -FRAME_COUNT="N/A" -FPS="N/A" -if [[ "$CONFIG" == "development" ]] && [ -f "$SQLITE_FILE" ]; then - FRAME_COUNT=$(sqlite3 "$SQLITE_FILE" "SELECT COUNT(*) FROM VULKAN_API WHERE nameId IN (SELECT id FROM StringIds WHERE value='vkQueuePresentKHR');" 2>/dev/null || echo "N/A") - if [[ "$FRAME_COUNT" != "N/A" && "$FRAME_COUNT" -gt 0 ]]; then - FPS=$(echo "scale=2; $FRAME_COUNT / $DURATION" | bc) - fi -fi - -# Display summary -echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}${BOLD} PROFILING RESULTS ${NC}" -echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════════${NC}" -echo "" -echo -e "${YELLOW}Test Configuration:${NC}" -echo " Build: ${CONFIG^^}" -echo " Duration: ${DURATION} seconds" -echo " Mode: Stationary + Invincible" -echo "" - -if [[ "$CONFIG" == "development" ]]; then - echo -e "${YELLOW}Frame Performance:${NC}" - echo " Frame Count: ${FRAME_COUNT}" - echo " Average FPS: ${FPS}" - echo "" -fi - -echo -e "${YELLOW}GPU Utilization Metrics:${NC}" -echo " GPU Active: ${GPU_ACTIVE}%" -echo " GR Active: ${GR_ACTIVE}%" -echo " SMs Active: ${SM_ACTIVE}%" -echo "" - -echo -e "${YELLOW}Generated Files:${NC}" -echo " Report: ${OUTPUT_PATH}.nsys-rep (${REPORT_SIZE})" -echo " SQLite: ${OUTPUT_PATH}.sqlite" -for f in "${OUTPUT_PATH}"*.csv; do - if [ -f "$f" ]; then - echo " CSV: $(basename "$f")" - fi -done -echo "" - -# Display OSRT API top 10 -echo -e "${YELLOW}OS Runtime API Summary (Top 10 by time):${NC}" -nsys stats -r osrt_sum "${OUTPUT_PATH}.nsys-rep" 2>&1 | grep -A 13 "Time (%)" | head -13 -echo "" - -echo -e "${GREEN}${BOLD}Done!${NC}" -echo "" -echo "To view full report in Nsight UI:" -echo " nsys-ui ${OUTPUT_PATH}.nsys-rep" diff --git a/scripts/profile_unreal_phased.sh b/scripts/profile_unreal_phased.sh deleted file mode 100755 index dc67793..0000000 --- a/scripts/profile_unreal_phased.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/bash -# ============================================================================= -# Unreal Engine Phased Nsight Profiling Script -# ============================================================================= -# Profiles the Unreal Engine game in 3 phases to avoid Nsight agent crashes -# -# Usage: -# ./profile_unreal_phased.sh [phase] -# -# Arguments: -# phase: 1, 2, 3, or "all" (default: all) -# Phase 1: 0-30 seconds (--start-time=0) -# Phase 2: 30-60 seconds (--start-time=30) -# Phase 3: 60-90 seconds (--start-time=60) -# ============================================================================= - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(dirname "$SCRIPT_DIR")" -UNREAL_DIR="$PROJECT_DIR/games/unreal/BulletHellGame/BulletHellCPP/Linux" -UNREAL_EXE="$UNREAL_DIR/BulletHellCPP/Binaries/Linux/BulletHellCPP-Linux-DebugGame" -DATA_DIR="$PROJECT_DIR/data/nsight/unreal/debug" - -PHASE="${1:-all}" -PHASE_DURATION=35 # 30s game + 5s buffer - -# Colors -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -CYAN='\033[0;36m' -RED='\033[0;31m' -NC='\033[0m' - -mkdir -p "$DATA_DIR" - -run_phase() { - local phase_num=$1 - local start_time=$2 - local output_name="unreal_phase${phase_num}_${start_time}s" - - echo -e "${CYAN}════════════════════════════════════════════════════════════${NC}" - echo -e "${CYAN} PHASE ${phase_num}: Starting at ${start_time}s${NC}" - echo -e "${CYAN}════════════════════════════════════════════════════════════${NC}" - - # Clean up any previous nsys processes - pkill -9 nsys 2>/dev/null || true - pkill -9 -f BulletHellCPP 2>/dev/null || true - sleep 2 - - # Clean nsight temp files - /bin/rm -rf /tmp/nvidia/nsight_systems/* 2>/dev/null || true - - echo -e "${YELLOW}Running Nsight profiler for ${PHASE_DURATION}s...${NC}" - - cd "$UNREAL_DIR" - nsys profile \ - --trace=osrt,vulkan \ - --gpu-metrics-devices=0 \ - --sample=none \ - --cpuctxsw=none \ - --output="$DATA_DIR/$output_name" \ - --duration=$PHASE_DURATION \ - --force-overwrite=true \ - "$UNREAL_EXE" BulletHellCPP --invincible --stationary --start-time=$start_time || true - - echo -e "${GREEN}✓ Phase ${phase_num} complete${NC}" - - # Export data if capture succeeded - if [ -f "$DATA_DIR/${output_name}.nsys-rep" ]; then - echo -e "${YELLOW}Exporting stats...${NC}" - nsys export --type sqlite -o "$DATA_DIR/${output_name}.sqlite" "$DATA_DIR/${output_name}.nsys-rep" 2>/dev/null || true - nsys stats -r osrt_sum --format csv -o "$DATA_DIR/$output_name" "$DATA_DIR/${output_name}.nsys-rep" 2>/dev/null || true - nsys stats -r vulkan_api_sum --format csv -o "$DATA_DIR/$output_name" "$DATA_DIR/${output_name}.nsys-rep" 2>/dev/null || true - - # Export GPU metrics if available - if [ -f "$DATA_DIR/${output_name}.sqlite" ]; then - sqlite3 -header -csv "$DATA_DIR/${output_name}.sqlite" " - SELECT - t.metricName, - COUNT(*) as samples, - ROUND(AVG(m.value), 2) as avg_value, - MIN(m.value) as min_value, - MAX(m.value) as max_value - FROM GPU_METRICS m - JOIN TARGET_INFO_GPU_METRICS t ON m.metricId = t.metricId - GROUP BY t.metricName - ORDER BY samples DESC; - " > "$DATA_DIR/${output_name}_gpu_metrics.csv" 2>/dev/null || true - fi - - local file_size=$(ls -lh "$DATA_DIR/${output_name}.nsys-rep" | awk '{print $5}') - echo -e "${GREEN}✓ Exported: ${output_name}.nsys-rep (${file_size})${NC}" - else - echo -e "${RED}✗ Phase ${phase_num} capture failed${NC}" - fi - - echo "" - sleep 3 # Cool-down between phases -} - -case "$PHASE" in - 1) - run_phase 1 0 - ;; - 2) - run_phase 2 30 - ;; - 3) - run_phase 3 60 - ;; - all) - echo -e "${CYAN}${BOLD}" - echo "╔═══════════════════════════════════════════════════════════╗" - echo "║ UNREAL ENGINE PHASED PROFILING (3 x 30 seconds) ║" - echo "╚═══════════════════════════════════════════════════════════╝" - echo -e "${NC}" - - run_phase 1 0 - run_phase 2 30 - run_phase 3 60 - - echo -e "${GREEN}════════════════════════════════════════════════════════════${NC}" - echo -e "${GREEN} ALL PHASES COMPLETE${NC}" - echo -e "${GREEN}════════════════════════════════════════════════════════════${NC}" - - # List captured files - echo "" - echo "Captured files:" - ls -la "$DATA_DIR"/unreal_phase*.nsys-rep 2>/dev/null || echo "No captures found" - ;; - *) - echo "Usage: $0 [1|2|3|all]" - exit 1 - ;; -esac