Physics engines
SoftBody2D builds ordinary Godot nodes, so it runs on Godot Physics and on Godot Rapier Physics alike. What differs:
| Godot Physics | Godot Rapier Physics | |
|---|---|---|
| Softbodies, breaking by distance, cutting, joint reach | yes | yes |
Force based breaking (break_mode = FORCE) | no, the joint reaction force is not exposed | yes |
| Joint load in Debug Draw | stretch | reaction force |
| Feel at the same Softness | stiffer | softer |
SoftBody2DPhysics.has_rapier() is true only when the extension is installed and selected as the 2D physics engine; with Godot Physics selected the Rapier server never sees the joints and every reading is zero, so the node shows a warning.
Performance
Cost is bodies plus joints, and Vertex Interval sets the body count: halving it quadruples them. Keep physics/common/physics_ticks_per_second at 60 — a 10 ms tick cannot run 120 times a second and the frame rate collapses. Joint Reach 1 buys count at the price of a softbody that sags and self-collides.
Measured with the benchmark demo on an Apple silicon laptop with Rapier, softbodies dropped in until the frame rate gives:
| configuration (51 bodies per softbody unless noted) | under 60 fps at | under 30 fps at |
|---|---|---|
| default: interval 40, reach 2, 60 ticks/s | 18 softbodies (918 bodies, 5868 joints) | 34 (1734 bodies, 11084 joints) |
| same at 120 ticks/s | 9 (459, 2934) | 14 (714, 4564) |
| interval 60 (23 bodies each) | 59 (1357, 7198) | 120 (2760, 14640) |
| interval 30 (86 bodies each) | 20 (1720, 12000) | 20 |
| reach 1 | 36 (1836, 4428) | 44 (2244, 5412) |
So: 18 default softbodies at 60 fps, 60 at interval 60, half as many at 120 ticks/s; at 30 fps about double.
Tuning across engines
Softness is not the same scale on both engines: Rapier is softer at the same value. Lower it, or keep Joint Reach at 2.