Ich würde dir empfehlen alle Werte binär und komprimiert zu versenden. Das geht relativ einfach. Deine Struktur, also ein Grid so weit ich vernehmen kann, mit der GM eigenen Funktion in eine temporäre Datei speichern. ds_grid_save() glaube ich. Das ist binär, und daher an sich schon mal recht klein.
Wie gesagt 9.600.024 Zeichen Lang...
Wenn du nur die Werte 0 bis 255 in der Tabelle/Grid hast, sieht es noch mal anders aus. Dann würde ich es angehen, wie man es üblicherweise bei zb. Bitmap Bildern macht. Um eine String-Repräsentation deine Map zu bekommen, würde ich den String folgendermaßen aufbauen.
Das wiederum wäre möglich, ich könnte, um nicht meine komplette struktur zu verändern statt -1, 0 verwenden da die 0 Momentan eh nicht als BlockID vor kommt. Macht immernoch 300.000 Bytes, ca 0,29MB(!!). Das ist aber für den Anfang eine große einsparung. Versendet man diesen wieder Stück für Stück, ist man bei 120Steps/s und 20Paketen/Step immernoch bei 2minuten übertragungszeit, das lässt sich mit größeren Paketen verbessern. Der Ansatz gefällt mir zumindest sehr gut! Wie sehr kann man so eine Zeichenkette denn komprimieren?
EDIT:
Für die laufenden Änderungen hätte ich zwei Lösungen: eine schnelle und eine sparsame.
Das Löse ich genauso wie die Übertragung von Laufen und Springen. Wird direkt übertragen(x,y,id).