Download Game! Currently 102 players and visitors. Last logged in:RiistisValkristValoWilli

Blitzer's Blog >> 71572

Back to blogs index
Posted: 27 Jul 2026 17:08 [ permalink ]
TC$mC$ on tietojenkC$sittelytieteen ja hajautettujen jC$rjestelmien ehdotonta
ydintC$! Olet juuri omin sanoin kuvannut ongelman, jota ratkotaan
nykyaikaisissa pilvipalveluissa (kuten Kubernetes-klustereissa) ja
pelimoottoreiden rinnakkaislaskennassa.

Se, ettC$ haluat ratkaista tC$mC$n hajautetun (peer-to-peer) fysiikkamoottorin
ilman "Master/Slave" -hierarkiaa ja *retrohengessC$* VIC-20/C64-tyylisillC$
rajoitteilla, on aivan loistava arkkitehtuurinen haaste.

TC$ssC$ on kolme tapaa ratkaista "Kuka laskee kiven?" -ongelma siten, ettC$
tyC6kuorma jakautuu tasan, skaalautuu automaattisesti 1100 pelaajalle, eikC$
yksikC$C$n kivi jC$C$ jumiin.

---

### 1. Varjo-RAM ja Hajautettu Lukko (The Shadow RAM Mutex)

Osuit naulan kantaan siinC$, ettC$ jokaisella kivellC$ pitC$isi olla oma
"state-mappi". C64:ssC$ ja VIC-20:ssC$ tC$mC$ on todella luonnollinen
konsepti: NiissC$hC$n oli erikseen "NC$yttC6muisti" (Screen RAM) ja
"VC$rimuisti" (Color RAM). VC$rimuisti oli fyysisesti samankokoinen ja kulki
kC$si kC$dessC$ nC$yttC6muistin kanssa.

Teemme samoin The Dark MeshissC$:

* **NC$yttC6muisti (Osoitteet 4000040639):** SisC$ltC$C$ itse objektin (esim.
2 = Kivi).


* **Varjo-muisti (Osoitteet 4100041639):** SisC$ltC$C$ fysiikan tilan (0 =
Vapaa, 1 = Claimattu, 2 = Cooldown).

**Miten algoritmi toimii (Compare-And-Swap -simulaatio):**

1. Pelaajan 1 kone iteroi muistia ja lC6ytC$C$ kiven osoitteesta `40100`.


2. Se katsoo varjomuistia: `PEEK 41100`. Jos arvo on `0` (Vapaa), P1
pC$C$ttC$C$ "claimata" kiven laskennan kirjoittamalla sinne oman ID:nsC$:
`POKE 41100, 10`.
3. VerkkoviiveestC$ johtuen P2 saattoi yrittC$C$ samaa tismalleen samaan
aikaan! Siksi P1 odottaa esim. 50 millisekuntia ja tarkistaa: `PEEK 41100`.
4. Jos arvo on edelleen `10`, P1 voitti "huutokaupan". Se laskee kiven
putoamisen uuteen osoitteeseen `40132`, vapauttaa vanhan lukon (`POKE 41100,
0`), ja asettaa uuden kiven pC$C$lle cooldown-lukon (`POKE 41132, 255`).
Cooldown estC$C$ kiveC$ putoamasta valonnopeudella ruudun lC$pi.

### 2. YlimmC$n bitin kC$C$ntC6 (The 8-bit Tick-Flop)

Mainitsit huolesi siitC$, kannattaako jokaista tilaa varten luoda uusi
symboli. 8-bittisessC$ ohjelmoinnissa on kaunis kikka tC$hC$n: **KC$ytetC$C$n
tavun ylintC$ bittiC$ (Most Significant Bit, arvo +128) tilan merkkinC$.**

TC$mC$ tekee koko Varjo-RAMin tarpeettomaksi ja perustuu **Soluautomaatteihin
(Cellular Automata)**.

MC$C$ritellC$C$n kaksi globaalia vuoroa (Tick A ja Tick B):

* Normaali kivi on `2`.
* YlimmC$llC$ bitillC$ merkitty kivi on `130` (2 + 128).

**Miten algoritmi toimii:**

1. Kaikki tietokoneet tietC$vC$t, ettC$ nyt pelataan "Parillista vuoroa" (Tick
A). Kaikki etsivC$t kiviC$, joiden arvo on `2`.
2. P1 lC6ytC$C$ kiven arvolla `2`. Se laskee sen putoamisen ja siirtC$C$ kiven
alempaan ruutuun, mutta kirjoittaakin sinne arvon **`130`** (Se on Tick B:n
kivi!).
3. Kun P2 saapuu myC6hemmin samalle kivelle, se nC$kee arvon `130`. P2
ajattelee: *"Ahaa, tC$mC$ kivi on jo laskettu tC$llC$ vuorolla,"* ja hyppC$C$
sen yli!
4. Kun kaikki koneet ovat kC$yneet ruudun lC$pi (tai tietty aikaraja
umpeutuu), globaali vuoro vaihtuu Tick B:hen. Nyt kaikki koneet etsivC$t arvoa
`130`, laskevat fysiikan, ja muuttavat kivet takaisin arvoon `2`.

TC$mC$ on C$C$rimmC$isen elegantti tapa! Se ei vaadi lainkaan lukkoja, ja jos
yksinpelaaja pelaa peliC$, sama logiikka toimii tC$ydellisesti yhden koneen
voimin.

### 3. Satunnainen Skannaus (Stochastic Load Balancing)

Miten varmistetaan, ettei kC$y niin, ettC$ Pelaaja 1 ehtii aina laskemaan
kaikkien kivien fysiikat, ja Pelaaja 2 pyC6rittC$C$ vain tyhjC$C$ looppia?

Perinteisesti nC$yttC6 skannataan vasemmalta oikealle, ylhC$C$ltC$ alas. Jos
teemme hajautetun jC$rjestelmC$n, meidC$n kannattaa **rikkoa determinismi
skannauksessa**.

* P1 aloittaa skannauksen ylhC$C$ltC$ alas.
* P2 aloittaa skannauksen alhaalta ylC6s.
* P3 aloittaa keskeltC$ ja etenee spiraalina ulospC$in.

Tai vielC$ parempaa: **Stokastinen valinta**. Ohjelmat iteroivat jatkuvasti
satunnaisia muistiosoitteita. Jos sieltC$ lC6ytyy kivi, jonka tilabitti kertoo
sen kaipaavan laskentaa, se lasketaan. Kun koneita on verkossa enemmC$n,
satunnaisia osumia tapahtuu tiheC$mmin ja fysiikka pyC6rii tasaisemmin ja
nopeammin koko ruudulla. TC$mC$ tekee verkosta ikC$C$n kuin yhden ison,
kaoottisen moniytimisen prosessorin.

---

### Miten jatkamme?

Jos haluat lC$hteC$ toteuttamaan tC$tC$ eleganttia ratkaisua The Dark Meshiin,
"YlimmC$n bitin kC$C$ntC6" (Tick-Flop) yhdistettynC$ meidC$n `mesh_irc_dsm.js`-
moduuliin voisi olla kaikkein kiehtovin reitti.

Silloin muuttaisimme nykyisen `bd_physics.js`-rutiinimme sellaiseksi, ettC$ se
etsii arvoja 2 ja 4, ja muuttaa ne putoamisen yhteydessC$ arvoiksi 130 ja 132.

Kutkuttaako jokin nC$istC$ arkkitehtuureista sinua eniten, vai herC$ttivC$tkC6
nC$mC$ jotain aivan uusia ideoita mieleesi?