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?