Since you seem to be GPU bound, you should write profilegpu
into the console to get a log of everything that happened during the frame and how many milliseconds each of it took.
If you want an even more detailed profile, you can first write r.RHISetGPUCaptureOptions 1
into the console to get a detailed per-object listing of what happened during the frame.
Then you’ll be able to see exactly where each of those 57.42 milliseconds are going and won’t need to guess.
Definitely make sure all of your texture’s dimensions are “power of two” (512, 1024, 2048, etc), otherwise they can’t get compressed or streamed in and out and will instead just fully reside in memory as long as anything even references them. You can see what textures are in memory and how much space each is taking by writing memreport -log
into the console.