(I know you said Multisync, but I don't remember the commands, and MikeNet/DarkNet commands are pretty similar.)
Two things come to mind..
1. Without seeing some code we can't really tell how well your code is optimized.
2. The host is handling x^n amount of data, while the clients are only handling x*n. So unless you use some pretty serious tricks of multiplayer game networking, it's going to be slower than the clients.
(x being the movement data, n being the number of players.)
Tips:
- Don't send player movements (or any data packets) every loop. That's just going to overload the connection and cause lag almost instantly. Instead, use a timer or loop counter to control how often you send player movement data.
- If the area in the game is large enough that some players can't see each other, do a simple check on the host to see if two players are close enough to bother sending them each others movements.
So, instead of using,
mn Send TCP ALL
use,
for plr = 1 to MAX_PLAYERS
if mn Client Connected(plr)
dist# = PlrDistanceToPlr(plr, plr_moving)
if dist# < 2000
mn Send TCP inst, Send, plr, 1, 1
endif
endif
next plr
mn Clear Packet Send
function PlrDistanceToPlr(p1 as dword, p2 as dword)
dx# = Players(p1).x - Players(p2).x
dy# = Players(p1).y - Players(p2).y
dz# = Players(p1).z - Players(p2).z
d# = (dx# * dx#) + (dy# * dy#) + (dz# * dz#)
d# = d# ^ 0.5
endfunction d#
It looks like a lot of processing, and it is, but trust me, when you have 20 players in the game, and only 5 of them are within 2000 units of each other, this is a huge time saver.
Also, using UDP to send player movement data helps. Which you may already be doing, but it's hard to tell without some code.
There are other things too, like decoupling your game loop from your display loop. But that's a whole other discussion...