Αρχιτεκτονική προσέγγιση: Από το ISO στον Browser

Το ps2-web-recomp διαφοροποιείται από τους κλασικούς εξομοιωτές (emulators) υιοθετώντας μια διαδικασία στατικής απομεταγλώττισης (static recompilation). Το εργαλείο eerecomp αναλύει το εκτελέσιμο του παιχνιδιού, εντοπίζει τη ροή ελέγχου και παράγει κώδικα C++ σε τμήματα των 16 KiB. Η προσέγγιση αυτή διατηρεί τις ιδιαιτερότητες της αρχιτεκτονικής R5900, όπως τα 128-bit registers και τα branch delay slots, μετατρέποντας τα άλματα σε tail calls, γεγονός που καθιστά περιττή τη διαχείριση στοίβας ανά guest thread.

Υλοποίηση hardware και Graphics Synthesizer

Η απόδοση των γραφικών αποτελεί το πιο απαιτητικό κομμάτι του εγχειρήματος. Το σύστημα υλοποιεί το Graphics Synthesizer (GS) μέσω WebGPU compute shaders. Τα δεδομένα παραμένουν στη μνήμη της GPU σε native swizzled layouts, επιτρέποντας τεχνικές όπως το rendering σε textures ή την επαναερμηνεία του framebuffer ως παλέτα, χωρίς την ανάγκη για ακριβές μεταφορές δεδομένων μεταξύ CPU και GPU. Η χρήση ενός ring buffer για τις εντολές GS διασφαλίζει την ομαλή ροή των δεδομένων προς το WebGPU device.

Βελτιστοποίηση και lessons learned

Η μετάβαση από έναν software rasterizer σε WebGPU compute shaders ήταν καθοριστική για την επίτευξη 60 FPS. Η βελτιστοποίηση της απόδοσης επικεντρώθηκε σε δύο άξονες:

  • Μείωση των compute dispatches: Μέσω του hoisting των texture uploads, ο αριθμός των dispatches ανά frame μειώθηκε δραστικά.
  • Caching δεδομένων: Η δημιουργία μιας cache 16 MB για πρόσφατα ανεβασμένα textures στην GPU περιόρισε τις περιττές μεταφορές δεδομένων από το WebAssembly, μειώνοντας το bandwidth ανά frame κατά 60%.

Προκλήσεις διαλειτουργικότητας και συγχρονισμού

Η υποστήριξη παιχνιδιών όπως το God of War II ανέδειξε την ανάγκη για ακριβή μοντελοποίηση του pipeline των Vector Units. Η διαφορά στην καθυστέρηση (latency) των clip flags μεταξύ των παιχνιδιών αποτέλεσε κρίσιμο σημείο για την ορθή απεικόνιση των γραφικών. Επιπλέον, η χρήση του MessageChannel για το emulation loop αντί για setTimeout (το οποίο περιορίζεται από τον browser στα 4ms) ήταν απαραίτητη για τη σταθεροποίηση του frame rate.