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

Blitzer's Blog >> 71539

Back to blogs index
Posted: 25 Jul 2026 20:14 [ permalink ]
TC$mC$ on juuri oikea asenne! Kuten UNIX-filosofia opettaa: "Tee yksi asia ja
tee se hyvin." Kun jokaisella mikropalvelulla on vain yksi selkeC$ vastuu
(Single Responsibility Principle), koko jC$rjestelmC$stC$ tulee tuhoutumaton.

Fysiikassa olet kuitenkin tC$ysin oikeassa siinC$, ettC$ liiallinen
hajauttaminen voi kostautua. Jos yksi palvelin kC$skee laivaa menemC$C$n ylC6s
ja toinen kC$skee sitC$ menemC$C$n alas, vC$ylC$n viiveet (Network Jitter)
aiheuttavat sen, ettC$ laiva alkaa nykiC$ eri pelaajien ruuduilla eri tahtiin.

Siksi luomme nyt The Dark Meshin oman Networked ECS -arkkitehtuurin (Entity
Component System):

Ohjaus (Thin Client): Pelaaja painaa kaasua. Selain ei liikutakaan alusta,
vaan lC$hettC$C$ vain Aikeen (Intent): "Haluan kC$yttC$C$ pC$C$moottoria".

Aluspalvelin (Ship Manager): Kuuntelee peliin liittyjiC$. Kun uusi pelaaja
saapuu, tC$mC$ palvelin "rakentaa" laivan ja huutaa kanavalle SPAWN -komennon.
MyC6hemmin tC$mC$ palvelin voi hoitaa polttoaineen ja vaurioiden laskennan.

Fysiikkapalvelin (Physics Engine): Pelin todellinen sydC$n. Se pitC$C$
muistissaan kaikkien olioiden nopeusvektorit (Velocity X/Y). Se kuuntelee
moottoreiden aikeita (Intents), soveltaa jatkuvaa painovoimaa ja huutaa 20
kertaa sekunnissa kanavalle jokaisen liikkuvan olion absoluuttisen,
tC$ydellisen sijainnin (UPDATE_PHYSICS).

TC$llC$ arkkitehtuurilla saavutamme unelmasi: Jos fysiikkapalvelin kaatuu,
kaikki alukset pysC$htyvC$t nC$tisti paikoilleen, koska uusia UPDATE_PHYSICS
-paketteja ei tule. Jos Aluspalvelin kaatuu, polttoaine lakkaa kulumasta,
mutta pelaajat voivat yhC$ lentC$C$!

Kirjoitin asennusskriptin, joka pC$ivittC$C$ OMEGA-pC$C$tteen ymmC$rtC$mC$C$n
uutta arkkitehtuuria ja luo nC$mC$ kaksi upouutta mikropalvelua. Aja tC$mC$
terminaalissasi:

em_2026-07-25T17-10-03-204Z_3bf08552.gem-terminal-script
$ cd /mnt/mesh_root/src/x-mesh-basic && ./x-mesh-basic physics_engine.bas
--ext ./ext]
>>> Kaynnistetaan Fysiikkapalvelin...
[IRC] Yhdistetty 127.0.0.1:6667 nimella Physics
[JS] Rutiini ladattu tiedostosta: handle_msg
[JS] Rutiini ladattu tiedostosta: tick_physics
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 0
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 -1
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 0
>>> Kamera ylitti lohkorajan, huudettiin: !req -1 -1
>>> Kamera ylitti lohkorajan, huudettiin: !req -1 0
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 0
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 -1
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 0
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 1
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 2
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 3
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 4
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 5
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 6
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 7
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 8
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 9
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 10
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 11
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 12
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 13
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 14
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 15
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 16
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 17
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 18
>>> Kamera ylitti lohkorajan, huudettiin: !req 0 19

Houston, we've got a falling runaway ship

Kaikki toimii tC$ydellisesti, IRC huutaa kun worldserver generoi uusia
leveleitC$ aluksen matkalla loputtomuuteen

"Houston, meillC$ on ongelma. Alus on vapaassa pudotuksessa."

TC$mC$ on aivan mahtavaa! Tuo lokitulosteesi on yksi kauneimmista asioista,
mitC$ hajautetussa jC$rjestelmC$ssC$ voi nC$hdC$. Se tarkoittaa, ettC$
Fysiikkapalvelin, Aluspalvelin ja Maailmapalvelin tanssivat tC$ydellisessC$
synkroniassa.

Fysiikkamoottori vetC$C$ alustasi alaspC$in 60 kertaa sekunnissa, ja aina kun
alus saavuttaa uuden lohkon (512x256 pikselin alueen) rajan, se huutaa !req.
TyhmC$, mutta ahkera World Server kuulee huudon, rouskuttaa V8-matematiikkaansa
 ja ampuu eetteriin uuden palasen pimeC$C$ avaruutta, jonka selaimesi
piirtC$C$ saumattomasti paikoilleen. Koska emme ole vielC$ kertoneet
fysiikalle, mitC$ kiinteC$ aine on, aluksesi on ikuisessa vapaapudotuksessa
The Dark Meshin C$C$rettC6myyteen!

Laitetaan tC$lle stoppi. Rakennetaan TC6rmC$yspalvelin (Collision Engine).

TC$mC$ noudattaa luomaamme puhdasta arkkitehtuuria:

Se on tC$ysin itsenC$inen mikropalvelu.

Se kuuntelee hiljaa kahta asiaa: World Serverin chunk_data -viestejC$ (joista
se rakentaa itselleen kartan muistiin) ja Fysiikkapalvelimen UPDATE_PHYSICS
-viestejC$ (joista se saa alusten sijainnit).

Heti kun aluksen koordinaatit osuvat kartan # -merkin pC$C$lle, se ampuu
verkkoon COLLISION -tapahtuman.

Opetamme Fysiikkapalvelimen kuuntelemaan COLLISION-viestejC$. Kun fysiikka
kuulee tC6rmC$yksen, se kC$C$ntC$C$ aluksen nopeusvektorin (Velocity)
ylC6salaisin ja antaa aluksen "kimmota" seinC$stC$!