Kaikki kirjoitukset

MMORPG Unreal Engine 5.8:lla – kehityspäiväkirja #1: auktoritatiivinen palvelin ja maailman arkkitehtuuri

Ancient Onlinen arkkitehtuuri: Unreal Engine 5.8 -asiakasohjelma, auktoritatiivinen C++-palvelin, 25 Hz:n maailmasilmukka ja lennossa muokattava maailma.

Työasema, jossa näyttöjä ja kannettavia tietokoneita on rinnakkain hämärästi valaistussa studiossa

MMORPG:n erottaa yksinpelistä palvelin kaiken näkemäsi takana. Ancient Online: Remastered -kehityspäiväkirjan ensimmäisessä osassa kerromme, miten rakennamme MMORPG:tä Unreal Engine 5.8:lla: miten työ jakautuu asiakasohjelman ja palvelimen kesken, miten maailmaa simuloidaan ja miten pystymme muokkaamaan yhtä yhtenäistä maailmaa lennossa.

Kaksi osaa: asiakasohjelma ja palvelin

Ancient Online koostuu kahdesta erillisestä ohjelmistosta:

  • Asiakasohjelma on kirjoitettu C++:lla Unreal Engine 5.8:n päälle. Sen tehtäviä ovat piirto, ääni, käyttöliittymä ja syötteet.
  • Palvelin on Unrealista riippumaton: kirjoitimme sen alusta alkaen C++23:lla. Kaikki pelin säännöt toimivat siellä.

Miksi kirjoitimme palvelimen erikseen emmekä pelimoottorin sisään? Koska MMORPG-palvelimen tarpeet ovat erilaiset kuin pelimoottorin: grafiikkaa ei ole, mutta on tuhansia entiteettejä, pysyvää dataa, pitkiä käyntiaikoja ja tarve ennustettavalle suorituskyvylle. Erillisen palvelimen ansiosta teemme vain tarvittavan työn ja hallitsemme jokaista tavua.

Auktoritatiivinen palvelin: asiakasohjelmaan ei luoteta

Perussääntömme on tämä: asiakasohjelma esittää väitteen, palvelin tekee päätöksen.

  • Liikkuminen: Pelaajan syöte lähtee palvelimelle, ja palvelin laskee sijainnin. Asiakasohjelma näyttää palvelimen ilmoittaman sijainnin pehmeästi interpoloiden. Niinpä asiakasohjelma, joka ”teleporttaa itsensä” tai kävelee seinän läpi, ei palvelimen näkökulmasta pääse mihinkään.
  • Taistelu: Lopputulokset, kuten vahinko, osumat ja taaksepäin paiskautuminen, lasketaan palvelimella. Palvelin esimerkiksi päättää, kaataako yhdistelmäisku vastustajan, ja lähettää tuloksen kaikille samaan aikaan.
  • Talous: Esineet, valuutta ja kauppatapahtumat muuttuvat vain palvelimella ja tietokannassa.

Tämän lähestymistavan hinta on, että verkkoviive on hallittava hyvin; palkintona on maailma, jossa huijaaminen on paljon vaikeampaa ja samat säännöt pätevät kaikkiin.

25 Hz:n maailmasilmukka

Palvelin päivittää maailman 25 kertaa sekunnissa. Jokaisella askeleella hirviöiden tekoäly, liikkuminen, taistelu, taitojen vaikutukset ja sää etenevät. Kiinteä askel pitää simulaation ennustettavana ja varmistaa, että sama syöte tuottaa aina saman tuloksen.

Jokaisen pelaajan ei tarvitse tietää kaikesta. Palvelin jakaa maailman ruudukkoon ja lähettää kullekin pelaajalle päivitykset vain niistä entiteeteistä, jotka ovat hänen kiinnostusalueellaan (eli lähellä). Näin verkkoliikenne pysyy kohtuullisena ruuhkaisessa kaupungissakin.

Kevyt binääriprotokolla

Asiakasohjelman ja palvelimen välillä ei ole JSONia eikä RESTiä; jokainen viesti on binääripaketti, jolla on kiinteä rakenne. Se säästää sekä kaistaa että suoritinaikaa. Kun lisäämme uuden järjestelmän (kuten sään, liikkumisen tai pelin sisäisen tilipalvelun), kirjoitamme sille erillisen, versioidun pakettisopimuksen, ja yhteisillä otsikkotiedostoilla takaamme, että asiakasohjelma ja palvelin toimivat saman sopimuksen pohjalta.

Pysyvyys: tallennus ilman, että peli joutuu odottamaan

Pelaajadata on PostgreSQL-tietokannassa. Ei kuitenkaan käy, että maailmasilmukka odottaisi tietokantaa joka askeleella. Siksi tallennus tehdään taustalla viivästettynä tallennuksena (write-behind): maailmapalvelin pudottaa muutokset jonoon (Redis), ja taustakirjoittaja vie ne tietokantaan erissä. Pelin kulku ei riipu tietokannan nopeudesta.

Kanavat ja kirjautumispalvelin

Pelaajat yhdistävät ensin kirjautumispalvelimeen, joka hoitaa tilin varmennuksen, hahmon valinnan ja istunnon. Sen jälkeen he siirtyvät yhdelle neljästä pelikanavasta (CH1–CH4). Kanavien reaaliaikainen tila näkyy pelisivuston Palvelimen tila -sivulla.

Yksi yhtenäinen maailma, jota muokataan lennossa

Ancient Onlinen maailma on suunniteltu yhdeksi yhtenäiseksi maailmaksi eikä latausruutujen erottamiksi erillisiksi kartoiksi; se on jaettu soluihin ja ladataan suoratoistamalla.

Maailman sisältö (maasto, objektit, hirviöiden sijoittelu) ei ole koodissa vaan tietokannassa, versioituna. Voimme muokata maailmaa pelin sisäisellä maailmaeditorilla: muutokset tehdään ensin luonnokseen, tarkistetaan ja sitten julkaistaan. Jokainen julkaisu luo uuden version, ja asiakasohjelma varmistaa tiivistettä vertaamalla, että sen hallussa oleva maailmadata vastaa palvelimen dataa. Jos ne eivät täsmää, se odottaa datan päivittymistä ennen kuin jatkaa peliin.

Tehtävät: Lua skriptikielenä

Tehtävät ja NPC-dialogit kirjoitetaan palvelimella Lua 5.4:llä. Näin voimme kehittää ja testata tehtäviä kääntämättä palvelinta uudelleen.

Pelaajien viestit eivät koskaan poistu palvelimiltamme

Emme käytä pelin sisäisen chatin kääntämiseen ulkoista käännöspalvelua. Ajamme omilla palvelimillamme paikallista, pelkällä suorittimella toimivaa käännösmallia; pelaajien viestejä ei lähetetä mihinkään ulkoiseen rajapintaan. Näin eri kieliä puhuvat pelaajat ymmärtävät toisiaan ilman, että heidän viestinsä koskaan poistuvat studiosta.

Mitä seuraavaksi

Kehityspäiväkirjan toinen osa käsittelee ratkaisuja, joita teimme tehdessämme samasta maailmasta pelattavan hiirellä, kosketusnäytöllä ja ohjaimella. Studioon voit tutustua kirjoituksessa Kuka on Astronaut Entertainment?; itse pelistä kertoo Pelit-sivu.

Jaa:
Saatavilla myös kielillä29