feat: added testy wydajnosci chapter

This commit is contained in:
Krzysztof kuhy Rudnicki 2026-01-27 19:06:10 +01:00
parent 44c73f011e
commit 0c5549733d
25 changed files with 425 additions and 710 deletions

106
.gitignore vendored
View File

@ -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

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

View File

@ -1,8 +0,0 @@
[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true
bAgreeToCrashUpload=false

Binary file not shown.

View File

@ -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}

View File

@ -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:
\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{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{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).
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{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{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 intensywna komunikacja międzywątkowa stanowią znaczący narzut, który
może przyczyniać się do
spadków wydajności w wymagających scenach.
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
View 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

View File

@ -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"

View File

@ -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"

View File

@ -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