Kako funkcioniraju emulatori za PlayStation, Xbox, Windows...?
Što je emulator? Program koji "prevodi" s jednog uređaja na drugi, kao što bi netko pretvorio datoteku iz .docx u .pdf? Kad bi to bilo tako jednostavno, dobili bismo emulator istog dana kada je izdana svaka konzola, ali to nije slučaj. Čekamo ga godinama ili ga uopće ne dobijemo. To je jedan od najizazovnijih podviga u programiranju ikad.
Emulator nije jednostavan pretvarač, već softverska verzija cijelog uređaja. Procesor, grafička kartica, memorija, zvučni čip i operativni sustav, a sve to mora raditi zajedno u harmoniji, u stvarnom vremenu i dovoljno precizno da igra ili program ni ne primijete razliku.
Gdje počinje razvoj? Odakle programerima ideja za razvoj?
Razvojni programeri emulatora gotovo nikada nemaju pristup službenoj tehničkoj dokumentaciji proizvođača konzole. Sony, Microsoft ili Nintendo ne dijele svoje interne specifikacije. Naprotiv, štite te informacije kao poslovnu tajnu. Zato svaki projekt započinje nečim što se u industriji naziva "obrnuti inženjering". To znači da razvojni programeri uzimaju pravi hardver, rastavljaju ga, analiziraju elektroničke sklopove, presreću signale između čipova i postupno iz hardverskog koda firmvera (tj. softvera ugrađenog izravno u uređaj) grade sliku o tome što procesor zapravo radi sa svakom naredbom.
To često uključuje pristup „čiste sobe“. Jedna skupina analizira i dokumentira kako uređaj radi, dok druga skupina koristi tu dokumentaciju, bez da ikada vidi originalni kod proizvođača, kako bi napisala novi program koji oponaša isto ponašanje. Ovo odvajanje nije samo tehnička formalnost, već i pravna zaštita, jer sama emulacija nije ilegalna, dok kopiranje vlasničkog koda proizvođača jest. Osim toga, programerima je potreban originalni BIOS ili firmware konzole, osnovni program za pokretanje koji kontrolira hardver. Korisnici ga obično moraju sami nabaviti, često izravno sa svoje konzole, jer nije zakonski dopušteno distribuirati ga zajedno s emulatorom.
Što programer treba znati?
Ako ste ikada čitali ili ćete čitati dnevnike programera emulatora poput RPCS3 za PlayStation 3 ili Eden za Nintendo Switch, brzo ćete shvatiti da takav razvoj zahtijeva veći tim, a ne samo jednu osobu. Potrebno je savladati širok raspon vještina.
Zahtijeva razumijevanje arhitekture procesora, bilo da se radi o PowerPC-u (procesor Xbox 360), ARM-u, MIPS-u ili x86, uključujući sve njegove instrukcije, registre i specifičnosti vremenskog usklađivanja. Također zahtijeva savladavanje rada GPU-a i prevođenje njegovih instrukcija u moderna grafička sučelja poput Vulkana ili DirectX-a. To uključuje emulaciju zvučnog čipa, kontrolera, hijerarhije memorije i operativnog sustava konzole, koji upravlja datotekama, nitima i pravima pristupa.
Najveći tehnički izazov često je dinamička rekompilacija, poznata i kao just-in-time (JIT) kompilacija. Umjesto da emulator interpretira svaku naredbu iz izvorne konzole jednu po jednu, što bi bilo presporo, on prevodi naredbe u strojni kod glavnog procesora u stvarnom vremenu, izvršavajući ih gotovo izvornom brzinom. To zahtijeva izuzetno precizno poznavanje obje arhitekture istovremeno, a rezultat mora ostati bit po bit identičan originalu, inače će se igra zamrznuti, srušiti ili prikazivati netočnu grafiku.

Zašto razvoj traje godinama, ponekad i desetljećima?
Odgovor se uglavnom krije u jednom primjeru – PlayStationu 3. Njegov Cell procesor, koji su zajednički razvili Sony, Toshiba i IBM, nije bio konvencionalni višejezgreni procesor, već jedna glavna procesorska jedinica (PPU) kombinirana s osam posebnih pomoćnih procesorskih jedinica (SPU), od kojih je svaka imala vlastitu malu lokalnu memoriju i nije imala izravan pristup glavnoj memoriji sustava. Programeri igara morali su ručno podijeliti posao između tih jedinica, jer nijedan kompajler to nije radio automatski, što je značilo da emulator nije mogao jednostavno kompajlirati kod kao što bi to učinio za konvencionalniji procesor.
Mora razumjeti stvarnu svrhu izuzetno specifičnog, ručno optimiziranog koda. Razvojni programeri RPCS3 morali su napraviti procesor koji je razbio gotovo sve pretpostavke x86 arhitekture o memoriji, koherentnosti podataka i nitima, kako bi prisilili svoje programe da rade na hardveru koji dijeli malo zajedničkih značajki s Cellom. Prvi javno dostupan prototip emulatora pojavio se 2011. godine, a čak i danas, više od desetljeća kasnije, tim povremeno najavljuje optimizacijske proboje koji tek sada značajno ubrzavaju dijelove igara koji se prije nisu mogli pokretati ili su imali ozbiljne probleme.
Xbox 360 predstavlja sličan, iako malo drugačiji, izazov. Razvoj Xenia emulatora započeo je 2013. godine, a svoju prvu komercijalnu igru uspio je lansirati relativno brzo, ali do 2018. godine programeri su bili zaglavljeni u točnoj emulaciji Xenos GPU-a, što je zahtijevalo gotovo tri godine potpunog prepisivanja grafičkog koda prije nego što su se performanse značajno poboljšale. Razlog tako dugih razvojnih ciklusa nije lijenost ili nedostatak vještine, već činjenica da emulator mora razumjeti tisuće rubnih slučajeva, posebne naredbe, greške u originalnom hardveru koje su programeri igara nesvjesno ili namjerno iskorištavali i osobitosti vremena koje nijedna dokumentacija ne opisuje jer jednostavno ne postoji službena dokumentacija.
Drugi faktor je pravni pritisak. Nintendo je posebno poznat po tome što koristi čekić. U veljači 2024. podnio je tužbu protiv programera popularnog emulatora Yuzu, tvrdeći da je ilegalno zaobišao zaštitu šifriranja Switcha, što dokazuje činjenica da je Zelda: Tears of the Kingdom dosegla milijun preuzimanja prije službenog izlaska.
Tropic Haze, tvrtka koja stoji iza Yuzua, pristala je na nagodbu od 2,4 milijuna dolara i potpuno ugasila emulator, a ubrzo nakon toga, Nintendo je također osobno kontaktirao glavnog programera konkurentskog projekta Ryujinx kako bi zaustavio razvoj, uklonio organizaciju i svu povezanu imovinu. Takvi slučajevi jasno pokazuju zašto mnogi talentirani programeri radije ostaju pri "sigurnijim" starijim konzolama, dok noviji projekti često ostaju anonimni ili raspršeni među nekoliko paralelnih ogranaka istog originalnog projekta.
Zašto je neke konzole teže probiti od drugih?
Općenito, što je njegova unutarnja arhitektura više slična standardnom računalu, to je lakše emulirati konzolu. PlayStation 1 i 2 koriste relativno konvencionalne procesore, pa su emulirani relativno rano i danas rade glatko čak i na skromnijem hardveru. Ali kada proizvođači ugrade vlastita, nestandardna rješenja, poput Cella na PS3, složenost raste eksponencijalno. Slično tome, Nintendo Switch, koji se temelji na prilagođenom Tegra čipu tvrtke Nvidia, ima svoje posebnosti u upravljanju memorijom i grafikom.
Situacija je još složenija s najnovijom generacijom, PlayStationom 5 i Xbox Series X/S, jer se radi o sustavima koji su arhitekturom bliži modernim računalima (AMD Zen procesori i RDNA grafika), ali istovremeno zaštićeni puno naprednijim sigurnosnim mehanizmima nego što su bili dostupni prethodnim generacijama. Trenutno praktički ne postoji funkcionalan emulator ni za jednu od ove dvije konzole, jer programeri još uvijek probijaju osnovne sigurnosne slojeve, što je puno drugačiji i sporiji izazov od klasične emulacije hardvera.
Emulacija na telefonu i računalu, postoje li neke razlike?
Emulacija na mobilnim uređajima ima dodatnu prepreku koju korisnici često ne vide. To je razlika između ARM procesorske arhitekture koja pokreće gotovo sve telefone i x86 koja je standardna na računalima. Dakle, kada pokrenete emulator konzole temeljen na x86 ili PowerPC-u na telefonu, program mora istovremeno prevesti instrukcije iz izvorne arhitekture u ARM, što je dodatni sloj računalnog rada koji nije potreban na računalu, gdje je glavni procesor često već x86.
Nadalje, Apple je do nedavno praktički zabranjivao emulatore na iPhoneima. Tek je u travnju 2024. Apple prvi put izričito dopustio emulatore retro igraćih konzola u svojim smjernicama za App Store, koje sada mogu ponuditi i preuzimanje igara. Prije toga, jedini način za dobivanje emulacije na iPhoneu bio je ili jailbreak ili komplicirano zaobilaženje putem web aplikacija.
Čak i nakon ove promjene, ograničenja ostaju. Iz sigurnosnih razloga, iOS strogo ograničava tzv. JIT kompilaciju, tj. dinamičko generiranje strojnog koda tijekom izvršavanja programa, što je glavna tehnika za postizanje prihvatljive brzine za zahtjevnije emulatore. Kao rezultat toga, mnogi emulatori na iPhoneu rade znatno sporije od istog projekta na Androidu, gdje takva ograničenja uglavnom ne postoje i gdje su programeri dugi niz godina imali otvoreniji pristup sistemskim resursima.
Postoji li neki Windows emulator? Winlator, GameHub, GameNative...
Ako čitate moje recenzije telefona, primijetit ćete da često uključujem testove raznih Windows igara, uz Android i Nintendo Switch. U ovom slučaju, izraz "emulator" nije najtehnički najtočniji. To je više skup slojeva kompatibilnosti naslaganih jedan na drugi.
Winlator je besplatna aplikacija otvorenog koda programera nadimka BrunoSX (brunodev85) koja pokreće Windows (x86_64) aplikacije i igre izravno na Android uređajima temeljenim na ARM-u, bez BIOS-a, bez pokretanja prave kopije sustava Windows i bez slike diska. Umjesto toga, Winlator kombinira dvije odvojene tehnologije, od kojih svaka rješava svoj dio problema. Prva je Wine, poznati projekt koji desetljećima prevodi pozive Windows API-ja (naredbe za otvaranje datoteka, pristup registru, crtanje grafike putem Direct3D-a ili reprodukciju zvuka) u naredbe koje razumije Linux kernel na kojem Android radi u pozadini.
Druga tehnologija je Box86 ili Box64, koja obavlja još temeljniji zadatak. Prevodi same instrukcije procesora iz x86 arhitekture u ARM arhitekturu u stvarnom vremenu, budući da nijedan telefon fizički nema x86 procesor. Uz to, postoji i grafički sloj. Winlator koristi Mesin Turnip upravljački program za Adreno GPU-ove te alate DXVK i VKD3D koji prevode DirectX pozive u Vulkan, slično onome što Proton radi na Linuxu.
Korisnik unutar aplikacije stvara takozvani kontejner, svojevrsno izolirano virtualno okruženje u kojem zasebno za svaku igru ili program postavlja rezoluciju, virtualnu količinu VRAM-a, broj procesorskih jezgri i upravljačke programe.
Budući da postoje dva uzastopna prijevoda (prvo API pozivi, zatim naredbe procesora), opterećenje hardvera telefona je puno veće nego kod klasične emulacije konzole. To je ujedno i razlog zašto Winlator relativno dobro pokreće starije ili manje zahtjevne igre, ali kod modernih AAA igara sa zahtjevnim grafičkim engineima poput Unreal Enginea često dolazi do zastoja pri kompilaciji shadera i značajnog zagrijavanja uređaja. Do sada se RedMagic 11S Pro najbolje nosio s toplinom, ali je za to morao koristiti ventilator i vodeno hlađenje.

Jesu li GameHub i GameNative različiti?
Kad je Winlator postao dovoljno popularan, oko njega su se počeli pojavljivati konkurenti, koristeći u osnovi isti tehnološki recept (Wine, Box64, Vulkan), ali se razlikujući po tome koliko je sve prijateljski zapakirano.
GameNative se razvio iz projekta Pluvia, neslužbenog Steam klijenta koji je korisnicima omogućavao prijavu na svoj Steam račun putem Winlatora i izravno pokretanje igara iz svoje biblioteke bez potrebe za ručnim pretraživanjem instalacijskih datoteka na mreži. GameNative je nastao kao spin-off projekta Pluvia i trenutno se razvija brže i aktivnije od originalnog projekta.
GameHub ima malo drugačije podrijetlo. Aplikaciju, prije poznatu kao GameFusion, izradio je kineski proizvođač igraćih kontrolera Gamesir, a glavna joj je prednost praktičnost. Podržava prijavu na Steam, što službeni Winlator ne dopušta prema zadanim postavkama, a podržava i vibraciju u kontrolerima. Budući da je riječ o proizvodu kineskog proizvođača hardvera, u zajednici su se pojavile zabrinutosti oko privatnosti, pa je stvorena verzija pod nazivom GameHub Lite bez ugrađenog praćenja.
Je li bolje emulirati rezultat ili cijeli uređaj?
Emulatori ne moraju uvijek ponovno stvoriti svaki tranzistor izvornog sustava. Često koriste pristup emulacije visoke razine (HLE). Umjesto detaljnog emuliranja cijelog hardvera ili sistemskog softvera, emulator prepoznaje što igra želi postići i izvršava istu funkciju vlastitom implementacijom.
Suprotno je LLE (emulacija niske razine), gdje programer pokušava što više nalikovati stvarnom ponašanju originalnog hardvera ili firmvera.
HLE može biti dramatično brži. Problem nastaje kada igra nije koristila značajku kako je predviđeno. Ako bi programer igre otkrio nedokumentiranu osobitost stvarnog sustava i namjerno je iskoristio, elegantna HLE implementacija mogla bi učiniti "logički ispravnu" stvar, dok bi originalna konzola učinila nešto potpuno drugačije.
Zašto jedna igra radi savršeno, dok druga uopće ne počinje?
Ako emulator može emulirati PlayStation 2, zašto bi uopće bilo važno koju PS2 igru pokrećem? Jer nijedne dvije igre ne koriste konzolu na potpuno isti način.
Jedna igra može koristiti samo najčešće grafičke značajke, dok druga koristi neobično "miješanje". Jedna koristi standardne izračune s pomičnim zarezom, druga se oslanja na vrlo specifičnu shemu zaokruživanja. Jedna koristi standardni kontroler, druga mikrofon ili poseban dodatak. Treća može sadržavati trkaći engine čiji rad nenamjerno ovisi o preciznom vremenu događaja procesora.
Stoga, testiranje emulatora nije isto što i testiranje obične aplikacije. Zaista dobar regresijski test je biblioteka od stotina ili tisuća igara.
A onda dolazi zakrpa koja konačno osposobi jednu igru kako treba, ali pokvari tri druge.

Ironično, "lažno" je često bolje od originala
Kada je emulator dovoljno točan, može se dogoditi da emulirana igra izgleda i radi bolje od originala.
Igra koja je napravljena za 480p može se renderirati u 1440p ili 4K pomoću emulatora. Može renderirati geometriju u višoj izvornoj rezoluciji, poboljšati filtriranje tekstura, koristiti moderno anti-aliasing, ispraviti omjer slike i u nekim slučajevima ukloniti izvorno ograničenje broja sličica u sekundi. Emulator može ponuditi brzo spremanje stanja, premotavanje vremena, alternativne teksture, ispravke i modifikacije koje nikada nisu postojale na pravoj konzoli.
Ponekad emulator radi bolje na Linuxu nego na Windowsima
Mnogi emulatori i slojevi za prevođenje, poput Protona, bolje rade na Linuxu. Objašnjenje leži prvenstveno u načinu na koji operativni sustav komunicira s hardverom. Vulkan, moderno i otvoreno grafičko sučelje, nudi nižu upotrebu CPU-a i izravniju kontrolu nad grafičkom karticom od starijih, ali još uvijek često korištenih pristupa na Windowsima, a Linux upravljački programi za Vulkan su posljednjih godina sazreli do te mjere da često imaju manje sistemskog opterećenja od Windowsa.
Osim toga, alat DXVK, koji je dio Protona, prevodi DirectX pozive u Vulkan u stvarnom vremenu, što je iznenađujuće često brže nego da sam Windows izravno izvršava izvorni DirectX poziv, jer izbjegava određene slojeve operativnog sustava koji jednostavno ne postoje na Linuxu. Linux također omogućuje nižu latenciju u međuprocesnoj komunikaciji i predvidljivije raspoređivanje niti unutar sistemske jezgre, što je vrijedna prednost za emulatore koji moraju koordinirati desetke paralelnih zadataka u svakom okviru.
Da biste se bavili razvojem emulatora, morate biti majstor i lud u isto vrijeme.
Dok žonglirate CPU naredbama, API pozivima, sigurnosnim mehanizmima i tiho se nadate da vam Sony i Nintendo neće pokucati na vrata, morate podnijeti i visoka očekivanja zajednice za koju razvijate emulator bez ikakvih financijskih očekivanja. Međutim, manjina, koja je vrlo glasna, često ima previsoka i neutemeljena očekivanja da je razvoj takvog softvera relativno jednostavan. Ako postoji emulator za Nintendo Switch, razvoj emulatora za Nintendo Switch 2 ne bi trebao biti tako težak, zar ne?
Svaki novi proboj zapravo znači mjesece pretraživanja grešaka, čitanja heksadecimalnih izvadaka strojnog koda i pokušaja razumijevanja odluka današnjih i prošlih inženjera koji su pisali kod prije dvadeset godina ne razmišljajući da će ga itko ikada pokušati ponovno stvoriti na potpuno drugačijem hardveru.
Kombinacija tvrdoglavosti, znatiželje i ljubavi prema očuvanju igraće baštine ono je što uopće omogućuje emulaciju i razlog zašto će borba za svaku sljedeću generaciju konzola gotovo potpuno iznova započeti.




















