mirror of
https://github.com/kuhyx/praca_magisterska.git
synced 2026-07-04 12:03:01 +02:00
feat: added testy wydajnosci chapter
This commit is contained in:
parent
44c73f011e
commit
0c5549733d
106
.gitignore
vendored
106
.gitignore
vendored
@ -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
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
[CrashReportClient]
|
||||
bHideLogFilesOption=false
|
||||
bIsAllowedToCloseWithoutSending=true
|
||||
CrashConfigPurgeDays=2
|
||||
Stall.RecordDump=false
|
||||
Ensure.RecordDump=true
|
||||
bAgreeToCrashUpload=false
|
||||
|
||||
BIN
latex/main.pdf
BIN
latex/main.pdf
Binary file not shown.
@ -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}
|
||||
|
||||
@ -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}
|
||||
|
||||
258
scripts/profile.sh
Executable file
258
scripts/profile.sh
Executable file
@ -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 <engine> [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 <engine> [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
|
||||
@ -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"
|
||||
@ -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"
|
||||
@ -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
|
||||
Loading…
Reference in New Issue
Block a user