I don't know what you're envisaging zootan, but I'm not making a game with thousands of objects. I probably wouldn't have more than 100 physics objects in total. Essentially each one would just need float posxyz, float rotxyz, float velocityxyz, float rotational_velocityxyz. 12 floats per object. 1200 floats.
The server would only tell the client about the objects that were on screen (or close to being on screen) and moving. Values would be interpolated between a client side physics system.
Imagine this:
- Server runs a version of the simulation
- Client runs a version of the simulation
- The clients version of the simulation runs against hidden objects, so none of them are visible. Crates are being moved around locally, but you can't see them (excluded).
- A duplicate of all physics items is visible, and this is positioned using interpolated values between local and server physics system.
So it works thus:
1. Player runs along and passed inside a crate
2. Local physics system detects collision and starts crate moving
3. Server receives player packet, positions player and makes its version of the crate move.
4. Server works out this crate is of interest to the client, because its close to him and on screen, so sends its version of the crate simulation values back to the client
5. Client receives these new values and updates its simulation accordingly, instantly positioning it's invisible version of the crate to the coordinates and velocities
6. Over time, client interpolates the position/rotation of the visible crate to the invisible one
7. Client continues to run local simulation and update it with values from the server, interpolating the visible crate into position
8. When the crate stops moving, the server stops sending updates.
It's not exactly simple, but I think it could work and would be fairly straight forward ... in principle.