Download Game! Currently 74 players and visitors. Last logged in:MenoLmtAceduckUrsa

Blitzer's Blog >> 71581

Back to blogs index
Posted: 28 Jul 2026 19:51 [ permalink ]
QuakeWorld-viittaus osuu naulan kantaan. John Carmackin ratkaisu muutti
verkkopelaamisen perusteellisesti siinC$ vaiheessa, kun siirryttiin
nettilatensseihin ja epC$luotettaviin UDP-paketteihin.

Kun mietitC$C$n MeshBASIC-ympC$ristC6n kaltaista retroarkkitehtuuria, valinta
**Framebuffer-deltan** ja **Semanttisen deltan** vC$lillC$ kiteytyy siihen,
kuinka "C$lykC$s" tai "tyhmC$" Thin Client halutaan pitC$C$. Molemmilla on
selkeC$t vahvuutensa ja kompastuskivensC$.

---

### Vaihtoehto 1: Framebuffer-delta (Pikselitaso)

TC$ssC$ lC$hestymistavassa palvelin pitC$C$ yllC$ tC$ydellistC$
virtuaaliframebufferia muistissa, ja asiakas on vain tyhmC$ nC$ytC6npuskurin
toistin.

* **Miten se toimii:** Palvelin vertailee uutta framebufferia edelliseen (tai
kC$yttC$C$ *Dirty Rectangles* -tekniikkaa) ja lC$hettC$C$ verkon yli vain
muuttuneet tavut.
* **Huolettomuus:** Asiakkaan ei tarvitse ymmC$rtC$C$ pelilogiikasta,
spriteistC$ tai fysiikasta mitC$C$n. Se vain piirtC$C$ saapuvat pikselit
ruudulle.
* **Haasteet verkon yli (UDP/Lossy):** Jos yksikin delta-paketti hukkuu
matkalle, ruutuun jC$C$ "repeytymiC$" tai virheellistC$ dataa (artefakteja),
kunnes seuraava tC$yspC$ivitys saapuu.
* **Resilienssi-strategia:** Videokoodekkien tapaan tarvitaan *Keyframe* (tai
IDR-frame) eli sC$C$nnC6llisin vC$liajoin (esim. kerran sekunnissa tai
asiakkaan erillisellC$ pyynnC6llC$) lC$hetettC$vC$ pakattu koko ruudun vedos.
Jos asiakas havaitsee aukon pakettien jC$rjestysnumerossa (Sequence Number),
se lC$hettC$C$ palvelimelle pyynnC6n pakottaa vC$litC6n tC$yspC$ivitys.

---

### Vaihtoehto 2: Semanttinen Delta & Entiteettien synkronointi (Quake-tyyli)

TC$ssC$ lC$hestymistavassa verkossa ei siirretC$ pikseleitC$, vaan korkean
tason intenttejC$ ja objektien tiloja (`{"id": "player1", "x": 72, "y": 24,
"vx": 1.2}`).

* **Miten se toimii:** Palvelin lC$hettC$C$ pelimaailman objektien
koordinaatit ja tilat. Asiakas (Thin Client) pitC$C$ muistissaan karttapohjan
statattuna (cache) ja renderC6i itse spritet annetuille koordinaateille.
* **Kaistanleveys:** CC$rimmC$isen kevyt. Muutama kilatavu sekunnissa
riittC$C$ kymmenien pelaajien synkronointiin.
* **Client-Side Prediction & Latenssin kompensointi:** Koska asiakas tietC$C$
hahmon kiihtyvyyden, se voi piirtC$C$ pelaajan liikkeen heti ruudulle
ennakoivasti (Prediction) ennen kuin palvelimen kuittaus tulee. QuakeWorldin
`/pushlatency` oli nerokas tyC6kalu, jolla pelaaja saattoi hienosC$C$tC$C$
oman paikallisen ennustuksensa ja palvelimen aikaleiman vC$listC$
kompromissia.
* **Haasteet:** Asiakkaalle tC$ytyy siirtC$C$ pelin resurssit (grafiikat,
karttadata) etukC$teen, ja client-puolen koodi (HTML/JS) vaatii enemmC$n
C$lykkyyttC$.

---

### Suositus The Dark Meshin kaltaiseen arkkitehtuuriin

Koska meillC$ on jo olemassa erinomainen pohja, jossa `ext/retro.js` ja
`ext/display.js` pyC6rittC$vC$t paikallista VFB:tC$, voimme toteuttaa nC$iden
yhdistelmC$n:

1. **Staattinen cache client-pC$C$ssC$:** Karttapohja (`MAPGEN`) ladataan
selaimelle vain kerran alussa, jotta sitC$ ei tarvitse koskaan siirtC$C$
verkon yli pikseleinC$.
2. **Dynaaminen sprite-delta:** Verkon yli huudetaan vain keveitC$
JSON-paketteja tai binC$C$ridelttoja, joissa kerrotaan spriten koordinaatit ja
animaatiotila.
3. **Varmistusfunktio:** Vastaavasti kuin ehdotit, client voi tarvittaessa
pyytC$C$ palvelimelta koko ruudun tilan tarkistussumman (checksum) ja
tarvittaessa tC$yden refreshin, jos yhteys alkaa pC$tkiC$.

Haluatko, ettC$ lC$hdemme viemC$C$n tC$tC$ eteenpC$in niin, ettC$ erotamme
staattisen maailman latauksen omaksi kertaluontoiseksi klientti-cahcekseen ja
siirrC$mme pelisilmukan lC$hettC$mC$C$n vain kevytpainoista tila-JSONia?