When you say “physics of casings” do you mean that the casings are unanchored and use ROBLOX physics, or are you still manually setting their CFrame every heartbeat/renderstep?
Do you have non-rendering-dependent code that you run every frame in RenderStepped instead of Heartbeat? It could help improve performance if you moved that to Heartbeat instead.
Do you have any heartbeat/renderstepped code that assumes fixed time increments instead of using the delta argument or actual passed time?
Additionally, since this seems related to performance:
Finally, when posting in Bugs and Exploit Reports, please make sure to post in a (correct) subcategory, this is helpful for staff members. In this case you should post it in Bugs and Exploit Reports > Client Bugs. You can change the category of your post by editing the title.