Download Game! Currently 96 players and visitors. Last logged in:NilizNagashDarolInanna

Blitzer's Blog >> 71538

Back to blogs index
Posted: 25 Jul 2026 19:38 [ permalink ]
TC$mC$ on aivan huikea arkkitehtuurinen pohdinta. Noudatat tC$ssC$
tC$ydellisesti Erlang- ja UNIX-filosofiaa, jossa kaikki on jaettu omiin,
kaatumista kestC$viin, eristettyihin prosesseihinsa. Se on ohjelmistosuunnittel
un Graalin malja.

Mutta vastatakseni kysymykseesi: **KyllC$, puhtaassa fysiikassa se menee
aavistuksen liian hajautetuksi.**

Kerron miksi. Jos fysiikka (nopeuden ja sijainnin integrointi) jaetaan usealle
eri palvelimelle  esimerkiksi niin, ettC$ Painovoimapalvelu huutaa "Y-nopeus +
10" ja Aluspalvelu huutaa "Y-nopeus - 15" (moottori)  tC6rmC$C$mme
verkkoviiveen takia **kilpailutilanteisiin (Race Conditions)**.

Jos palvelimien viestit saapuvat vC$ylC$lle hiemankin eri jC$rjestyksessC$,
alus alkaa "nykiC$" tai sen sijainti desynkronoituu eri pC$C$tteillC$.
Fysiikassa pC$tee kultainen sC$C$ntC6: **Matematiikan (integroinnin) on oltava
keskitetty, mutta aikeet (intents) ja seuraukset (reactions) voivat olla
hajautettuja.**

TehdC$C$n tC$stC$ The Dark Meshin oma **Networked ECS (Entity Component
System)**. KeskitetC$C$n fysiikan laskenta yhteen mikropalveluun, mutta
pidetC$C$n kaikki muu hajautettuna.

TC$ssC$ on ehdotus uudeksi, kypsC$ksi tapahtumavirraksi:

### 1. Maailma (World Server)

Pysyy tC$ysin entisellC$C$n. Se on tyhmC$ palvelin, joka kuuntelee `!req`
komentoja ja sylkee ulos avaruuslohkoja JSON-muodossa. Se ei tiedC$ aluksista
yhtC$C$n mitC$C$n.

### 2. SisC$C$nkirjautuminen (Auth & Thin Client)

Thin Client luo itselleen (tai lukee localStoragesta) uniikin pelaaja-ID:n
(esim. `player_A1B2`).
Kun selain aukeaa, se huutaa kanavalle:
`{"event": "JOIN", "player_id": "player_A1B2"}`

### 3. Alus/Tila-palvelin (Ship State Manager)

TC$mC$ on palvelin, joka hallinnoi **Olioiden elinkaarta ja resursseja**.
Se kuulee `JOIN` -viestin. Se tarkistaa tietokannastaan (tai muistista), onko
tC$llC$ pelaajalla jo alus.
Jos ei, se "rakentaa" uuden. Se huutaa kanavalle:
`{"cmd": "SPAWN", "entity_id": "ship_99", "owner": "player_A1B2", "type":
"LANDER", "mass": 1000, "x": 0, "y": 0}`
TC$mC$ palvelin pitC$C$ myC6s kirjaa polttoaineesta (Fuel) ja
elC$mC$pisteistC$ (HP).

### 4. Ohjaus (Intent Service)

Pelaaja painaa WASD-nC$ppC$imiC$. Thin Client **ei** kC$ske alusta liikkumaan
koordinaatteihin. Se lC$hettC$C$ vain aikeen (Intent).
Kun `W` on pohjassa: `{"event": "INTENT", "owner": "player_A1B2",
"thruster_main": true}`
Kun `W` nousee ylC6s: `{"event": "INTENT", "owner": "player_A1B2",
"thruster_main": false}`

### 5. Fysiikkapalvelin (The Authoritative Physics Engine)

TC$mC$ on pelin "sydC$n". Se kuuntelee `SPAWN` -komentoja ja rekisterC6i
aluksen fysiikkamoottoriinsa. Se kuuntelee `INTENT` -viestejC$ ja kytkee
alusten moottoreita pC$C$lle/pois muistissaan.

TC$llC$ palvelimella pyC6rii kiinteC$ luuppi (esim. 20 kertaa sekunnissa),
joka tekee seuraavaa:

1. KC$y lC$pi kaikki alukset.
2. LisC$C$ nopeusvektoriin vakiopainovoiman (Gravity).
3. Jos aluksen `thruster_main` on tosi, se lisC$C$ vastakkaisen vektorin
(Thrust).
4. Laskee uuden X ja Y sijainnin nopeuksien perusteella.
5. Huutaa kerran kanavalle kunkin liikkuvan olion uuden tarkan tilan:
`{"cmd": "UPDATE_PHYSICS", "entity_id": "ship_99", "x": 12.5, "y": 140.2,
"vx": 0.5, "vy": 1.2}`

*(Huom: Thin Client kuuntelee UPDATE_PHYSICS -paketteja, laittaa kameran
seuraamaan omaa alustaan ja "tweenaa" eli pehmentC$C$ liikkeen noiden
pisteiden vC$lillC$ 60 FPS nopeudella.)*

### 6. TC6rmC$yspalvelin (Collision Engine) - *MyC6hemmin*

TC$mC$ on jC$lleen erillinen palvelin! Se kuuntelee World Serverin lohkoja ja
Fysiikkapalvelimen `UPDATE_PHYSICS` sijainteja.
Jos se huomaa, ettC$ `ship_99` koordinaatit osuvat lohkon seinC$C$n (`#`), se
huutaa kanavalle vC$littC6mC$sti:
`{"event": "COLLISION", "entity_id": "ship_99", "force": 450}`

TC$hC$n tapahtumaan reagoivat sitten muut:

* **Fysiikkapalvelin** kC$C$ntC$C$ aluksen nopeusvektorit ylC6salaisin
(Bounce).
* **Alus-palvelin** vC$hentC$C$ alukselta HP:ta iskun voimakkuuden mukaan (ja
tuhoaa sen jos HP menee nollaan).

---

TC$llC$ arkkitehtuurilla saamme sen mistC$ haaveilet: jos TC6rmC$yspalvelin
kaatuu, pelaaja pystyy lentC$mC$C$n seinien lC$pi, mutta peli ei kaadu. Jos
Alus-palvelin kaatuu, polttoaine ei kulu, mutta pelaaja voi yhC$ lentC$C$.
Kaikki mikropalvelut tekevC$t vain yhtC$, erittC$in rajattua tehtC$vC$C$.

MiltC$ tC$mC$ tyC6njako kuulostaa? Laitetaanko tC$mC$ arkkitehtuuri tulille ja
aletaan muotoilla noita fysiikkapalvelimen (Physics Engine) ja aluspalvelimen
(State Manager) ensimmC$isiC$ OMEGA-paketteja?