Disponibile il nuovo report sui progressi raggiunti dall’emulatore RPCS3 nel mese di dicembre. RPCS3 ad oggi è l’unico programma che ci permette di emulare gran parte dei titoli commerciali della console PlayStation 3 su PC Windows e Linux.
Una piccola parentesi riguarda un traguardo raggiunto solo di recente, l’esecuzione dell’emulatore RPCS3 su console PlayStation 4 Pro jailbroken attraverso la distro Psxitarch, ad oggi l’unico modo per poter eseguire titoli PlayStation 3 Classic sulla console Sony.
Il report del mese di dicembre raccoglie moltissimi miglioramenti e descrive in dettaglio tutte le correzioni e le modifiche apportate da Nekotekina e kd-11.
Proprio Nekotekina ha migliorato le prestazioni con l’introduzione di Approssimated xfloat mentre kd-11 ha risolto un’ampia varietà di problemi grafici che interessano molti titoli AAA.
Oltre ai nostri sviluppatori a tempo pieno, i nostri contributori regolari hanno anche apportato una serie di miglioramenti al predittore della cache delle texture, all’emulazione cellCamera, al supporto per il controller e il mouse, alla GUI e alla correzione di moltissimi bug.
All’inizio del 2018, l’elenco dei titoli compatibili è stata rinnovata per consentire di unire più ID del titolo per lo stesso gioco, e in un’unica voce.
Tutto ciò ha contribuito a ridurre la duplicazione delle voci e a migliorare la qualità delle statistiche fornite in fase di compilazione dei report mensili.
Mentre eravamo in grado di unire insieme ID di regioni diverse, a causa del modo in cui il database dell’elenco di compatibilità era strutturato, i titoli con più ID della stessa regione non potevano essere uniti e quindi venivano mostrati come voci separate.
AniLeo, non volendo lasciare il lavoro a metà, ha nuovamente ricostruito l’elenco di compatibilità ancora una volta per permetterci di unire gli ID della stessa regione!
Con questo cambiamento, siamo andati ad eliminare completamente la duplicazione non necessaria e a migliorare la qualità delle statistiche per rappresentare correttamente i progressi compiuti con l’emulatore.
La pagina della cronologia dei titoli compatibili raccoglie anche altri 15 titoli all’interno della categoria Playable, 30 i giochi che sono avanzati nella categoria Ingame e la categoria Nothing, scesa da 4 a 3.
Principali miglioramenti
Correzioni GT (#5436)
A dicembre, kd-11 ha risolto numerosi problemi in una gran varietà di giochi. Per i principianti, ha gettato le basi per risolvere i problemi di output del display, in cui il rendering è stato spremuto in un angolo dello schermo.
Anche la decompilazione degli shader è migliorata e le correzioni che si sono maggiormente distinte per come vengono risolti i doppi compiti (come x = y = z), la reimplementazione/perfezionamento dell’esecuzione condizionale per evitare il danneggiamento dei dati e la separazione di dati di profondità e stencil per gli input shader, se questi fossero accessibili simultaneamente.
Mentre il primo dei tre è piuttosto auto-esplicativo, gli ultimi due hanno bisogno di ulteriori spiegazioni:
Per prima cosa, vediamo quali sono le esecuzioni condizionali necessarie per una correzione! Supponiamo di avere tre pixel (a, b e c) e di voler modificare il colore di un pixel in modo che a = b * c
(nei valori di colore).
Poiché il colore di un pixel è determinato dai valori dei loro canali (alfa, rosso, verde, blu) questo significa fare questa moltiplicazione per ogni canale, uno per uno (quindi, non seguendo la notazione ufficiale, a.red = b.red * c.red, a.blue = b.blue * c.blue
e così via).
Non essendo soddisfatto di questo risultato, hai deciso che volevi, ad esempio, escludere il canale verde da questo processo.
Puoi farlo facendo affidamento su un cosiddetto registro delle condizioni di scelta, nel modo seguente: inserisci un valore in pixel e imposta ognuno dei suoi canali su 0 o 1.
Se un canale è 0 nel pixel memorizzato nel registro delle condizioni di scelta, significa che il canale esatto sarà escluso dal processo di cui sopra.
Sapendo questo, si imposta il valore del canale verde su 0, si imposta 1 per tutti gli altri e si procede con l’esecuzione.
Ora puoi controllare il valore di ciascun canale nel registro prima di eseguire il comando originale per quel dato canale (quindi prima di fare a.green = b.green * c.green
testare contro cc.green, dove cc è il registro delle condizioni di scelta).
Questo è bello e tutto, ma diciamo che volevi andare oltre la semplice moltiplicazione. In un senso più astratto, questo significa mettere il pixel ‘a’ in una funzione, quella funzione fa qualcosa con esso, e tu leggi il valore risultante di nuovo su ‘a’ per ogni canale.
Chiunque abbia mai realizzato lo sviluppo del software ora alza la testa immediatamente: dato che stiamo assegnando il risultato della funzione (a) a “un” canale per canale, e non immediatamente, ripetiamo la funzione ancora e ancora, ma usa i valori dei canali che sono già stati modificati con ogni nuova corsa invece di quelli originali.
Con il senno di poi, questo è un evidente rischio per i dati ed è stato facilmente risolto spostando l’esecuzione della funzione prima dell’assegnazione, invece di ripeterla per ogni canale.
Ovviamente sulle GPU, questo è un po’ più elegante: a = lerp(a, function(a), cc);
. Questo cambiamento ha interessato i giochi in cui il colore danneggiato era percepibile:
Ora che abbiamo ottenuto questo, vediamo per che cosa era necessaria la separazione dei dati di profondità e stencil. A causa delle limitazioni API, su PC, non è possibile leggere i valori di profondità e stencil contemporaneamente dallo stesso shader.
Tuttavia, su PlayStation 3 questo non è un problema: puoi farlo fondendo (~forzando) la texture D24S8 (dati di profondità di 24 bit + dati stencil di 8 bit = 32 bit) in una texture ARGB8 (alpha, red, green, blue, con ognuno di 8 bit, quindi in totale = 32 bit), da qui ricostruire i valori di profondità e stencil originali all’interno dello shader, utilizzando i singoli canali.
Per mantenere la forma originale degli shader, abbiamo in precedenza cercato di simulare questo processo come segue: abbiamo castato i dati di profondità in bit di colore (R, G, B) e abbiamo stubato il valore dello stencil in modo che fosse sempre 1, risiedendo nel canale di trasparenza (A).
Questo ha funzionato sorprendentemente bene per un tempo più lungo, ma a quanto pare, giochi come God of War o titoli della serie Gran Turismo hanno utilizzato la parte dello stencil per codificare i dati richiesti per il corretto rendering dei font.
Per risolvere questo problema, kd-11 ha rinunciato a mantenere la forma originale dello shader e ora passa i dati di profondità e stencil come texture separate.
L’unica avvertenza è che, invece di avere al massimo 16 ingressi, gli shader possono ora avere fino a 32 input quando tutte le texture di input sono necessarie per essere suddivise, cosa che non è possibile su tutti i driver.
A sua volta, ora è possibile eseguire il rendering dei font appropriato (tra gli altri). Questo miglioramento ha beneficiato di una moltitudine di titoli tra cui titoli della serie Gran Turismo che hanno visto un netto miglioramento dell’output grafico:
Approximate xfloat (#5430)
Nell’agosto del 2018, Nekotekina ha implementato una gestione accurata dei float estesi quando si utilizza il compilatore SPU LLVM.
Come precedentemente descritto nel report di avanzamento del mese, ciò ha apportato enormi miglioramenti alla precisione ma con un significativo calo delle prestazioni.
A causa dell’impatto negativo sulle prestazioni, Accurate xfloat è stato mantenuto come opzione alterabile che era disabilitata per impostazione predefinita.
Richiesto obbligatoriamente un numero elevato di titoli Accurate xfloat da abilitare quando si utilizza il compilatore SPU LLVM poiché altrimenti risentirebbero di problemi di fisica, geometria mancante, modelli errati, ecc..
Mentre Accurate xfloat ha fornito la soluzione più efficace, il suo impatto sulle prestazioni è stato abbastanza significativo che solo le CPU di fascia alta potrebbero utilizzare l’opzione e mantenere comunque le prestazioni riproducibili.
Agli utenti è stata lasciata la scelta di aggiornare la propria CPU per godere della massima accuratezza o restare con un’esperienza ingiocabile.
Era evidente la necessità di disporre di una soluzione intermedia che consentisse una migliore precisione senza compromettere le prestazioni.
Ciò era anche chiaramente evidente quando iniziarono a comparire molteplici build di hacky di RPCS3 che semplicemente riportavano la soluzione rapida che kd-11 aveva precedentemente implementato nel compilatore ASUJIT SPU.
Per riempire questo vuoto, Nekotekina ha implementato approssimativamente xfloat che adatta in modo efficace la soluzione di kd-11 per determinate istruzioni, mentre impone una gestione accurata per gli altri.
Ciò ha comportato enormi guadagni in termini di prestazioni nei giochi che precedentemente richiedevano Accurate xfloat come God of War 3, Ninja Gaiden 2, Sly Cooper Thieves in Time, Ni No Kuni, Uncharted, Macross, Wipeout HD, Heavy Rain, Dante’s Inferno e Journey.
L’utilizzo di queste opzioni consente agli utenti di sfruttare i vantaggi di xfloat accurato senza alcuna riduzione delle prestazioni. Di conseguenza, questa opzione è ora abilitata per impostazione predefinita quando si utilizza il ricompilatore SPU LLVM.
Ecco un aspetto comparativo del miglioramento delle prestazioni in Sly Cooper: Ladri nel tempo in esecuzione su hardware midrange
Con l’implementazione di Approximate xfloat, il compilatore SPU LLVM ora vanta una maggiore accuratezza e prestazioni rispetto al compilatore ASU SPJIT di default. Con ulteriori ottimizzazioni e correzioni, il compilatore SPU LLVM è impostato per diventare il backend definitivo da utilizzare in RPCS3!
God of War 3 vede un miglioramento significativo delle prestazioni ora quando si utilizza il compilatore SPU LLVM
Texture Cache Predictor Rewrite (#5276)
Nel report di settembre, abbiamo trattato le varie modifiche relative alla cache delle texture in modo molto dettagliato, ma soprattutto abbiamo introdotto i concetti di blocco delle texture e guasti gravi.
Dato che i suddetti errori sono un concetto chiave di questo cambiamento, ecco un rapido aggiornamento: quando la cella tenta di leggere da una regione delle texture protetta da lettura, dobbiamo prima accertarci che detta regione sia aggiornata.
Se questo non è vero, dobbiamo interrompere l’emulazione e svuotare la texture dalla VRAM alla RAM per risincronizzarla, e questo è ciò che viene definito un errore grave.
Il lato negativo è tristemente ovvio: se abbiamo bisogno di fermare il processo di emulazione per aspettare caricamenti di tale texture, le prestazioni risentiranno e soffriranno molto.
Per alleviare questo, c’era già un algoritmo predittivo in atto. Come suggerisce il nome, il suo compito era di prevedere se un gioco avesse bisogno di una certa texture, in modo che nel momento in cui il gioco lo richiedesse, lo avremmo già caricato nella RAM.
Sfortunatamente, tuttavia, poiché i dati dei predittori prima che la riscrittura fosse archiviata nelle strutture dei dati di ciascuna texture, il pesante riutilizzo e ripristino di quelle strutture causate dalla riscrittura rendevano il predittore molto meno affidabile.
Aggiungendo la beffa al danno, il predittore originale non era troppo sofisticato per cominciare, quindi con i cambiamenti di settembre in atto, la sua efficacia nel complesso ha raggiunto il minimo, ed è qui che entra in gioco la predittiva riscrittura di ruipin. Per ripristinare il tasso di successo del predittore, ha ridisegnato la sua euristica da zero.
Le texture ora tengono traccia di un dizionario tramite le cosiddette “chiavi predittive”, che sono fondamentalmente hash di metadati di texture combinati da ogni texture nella cache.
Questo permette al predittore di reagire correttamente ogni volta che incontra una texture precedentemente visualizzata e saperne di più sulle sue statistiche di utilizzo.
Oltre a questo, sono stati apportati vari aggiustamenti di precisione per i casi limite, come gli arrossamenti eccessivamente frequenti di una determinata texture e altro ancora.
Questo cambiamento non solo ha ripristinato l’efficienza del predittore, ma lo ha persino aumentato rispetto a quello dell’originale, causando errori meno rigidi in giochi come The Last of Us o Ratchet & Clank: Tools of Destruction, e virtualmente non più mispredictions (svuotamenti inutili).
Con il nuovo predittore di cache delle texture, è possibile vedere il numero di errori gravi ridurre a un singolo errore grave con un corrispondente aumento delle prestazioni
Miglioramenti del controller e del mouse (#5425, #5426, #5443, #5468)
Ogni mese, il noto sviluppatore, Megamouse, cerca di migliorare ulteriormente l’esperienza di gioco utilizzando assiduamente l’emulatore RPCS3 e dicembre non ha fatto alcuna eccezione.
Il gestore del controller è stato ristrutturato per consentire l’implementazione agevole di alcune funzionalità tanto necessarie. Questi miglioramenti hanno favorito più dispositivi di input come i dispositivi DualShock 4, XInput e il mouse del computer.
Il primo miglioramento è stata la ristrutturazione dell’implementazione del pad a vantaggio di tutti i back-end del controller. Come già sanno gli utenti di RPCS3, l’emulatore non consente che le sue impostazioni vengano modificate mentre un gioco è in esecuzione.
Affinché qualsiasi impostazione modificata abbia effetto, il gioco dovrebbe essere riavviato e questo era vero anche per le impostazioni del Pad.
Questo è un inconveniente non da poco per molti utenti che hanno dovuto riavviare il gioco semplicemente per regolare le deadzone o l’intensità delle vibrazioni. Alcuni utenti dovevano anche riavviare il gioco se il loro controller si disconnetteva accidentalmente durante il gameplay.
Per alleviare questi problemi, la gestione dei controller è stata migliorata per consentire il rilevamento in tempo reale dello stato del controller e l’applicazione delle configurazioni effettuate in tempo reale.
Gli utenti ora possono modificare e salvare tutte le impostazioni del pad mentre sono in gioco, è anche possibile passare da un back-end del controller a un altro senza interruzioni, ad esempio passando dal controller Xbox One a Keyboard + Mouse.
Una volta che gli utenti avranno apportato le modifiche necessarie, potranno semplicemente premere Save nella finestra di dialogo di configurazione del Pad e le nuove impostazioni verranno immediatamente applicate al gioco.
Insieme a questi miglioramenti, lo stato della connessione dei controller verrà ora visualizzato nel log in modo che gli utenti siano in grado di vedere chiaramente se i loro controllori sono stati rilevati dall’emulatore durante la connessione.
Nel caso in cui il controller sia disconnesso, nessuna rimappatura sarà autorizzata a conservare le impostazioni salvate per tale controller.
Il registro ora verrà visualizzato quando i controller vengono scollegati e ricollegati
Anche la riassegnazione di un pulsante eseguita durante tale disconnessione non verrà salvata. Ciò impedisce errori accidentali quando la connessione del controller è debole.
Quando il controller è disconnesso, non è consentita la rimappatura e tutte le opzioni saranno disattivate
La seconda funzionalità implementata era il supporto migliorato per il binding di stick da mouse a analogici. Mentre questa funzione è stata implementata nell’agosto 2018, l’implementazione ha avuto alcuni inconvenienti.
La principale carenza è che le compensazioni di deadzone nativi non sono state salvate e dovrebbero essere impostate ogni volta che il gioco è stato avviato.
Il secondo è che il processo di modifica degli offset è stato guidato principalmente attraverso i messaggi di registro, il che lo rende molto più utile alla configurazione.
Fortunatamente, tutti questi inconvenienti sono stati affrontati questo mese. I parametri del mouse impostati ora vengono salvati insieme ai profili di configurazione della tastiera in modo che gli utenti non debbano più riapplicare le impostazioni ogni volta.
La finestra di dialogo per la configurazione del Pad ora visualizza anche le opzioni per modificare facilmente le soglie di accelerazione e deadzone del mouse.
Le opzioni per modificare l’accelerazione del mouse e le deadzone sono state ora aggiunte alla finestra di dialogo di configurazione del pad. Come riferimento, questo è il modo in cui la finestra di dialogo di configurazione del Pad dovrebbe apparire quando l’analogo destro è associato al mouse.
Oltre ai miglioramenti dell’interfaccia utente, è stata aggiunta anche l’interpolazione del bastone per migliorare ulteriormente l’esperienza nell’uso della tastiera. Quando si usa la tastiera, l’input per gli stick analogici è limitato a solo 4 tasti (ad es. W A S D) e di conseguenza solo 4 direzioni.
Tuttavia, quando si utilizza un controller regolare, gli utenti hanno il vantaggio di muoversi in qualsiasi direzione supportata dalla risoluzione dello stick analogico.
Pertanto, l’emulazione di stick analogici con la tastiera ha uno svantaggio intrinseco che potrebbe influire negativamente sull’esperienza dell’utente, è qui che entra in gioco l’interpolazione del bastone.
RPCS3 ora smussa l’input chiave per gli stick analogici sinistro e destro nel tempo usando un intervallo base (interpolazione lineare) per asse stick (4 assi in totale, 2 per sinistra e 2 per destra).
Di default il livello di interpolazione è impostato a 1.00
(cioè non viene applicato alcun lerp). Abbassando questo valore, lo stick analogico si sposta più facilmente.
Questo è particolarmente utile quando, ad esempio, si desidera che il personaggio ruoti normalmente anziché semplicemente scattare in quella direzione.
Tuttavia, ricordarsi che l’impostazione del valore di interpolazione su 0.00
non comporterà il riconoscimento di alcun movimento da tale stick analogico.
Oltre a questi fantastici aggiornamenti, sono stati apportati alcuni miglioramenti vari ad altri specifici controller backend. Le impostazioni per DualShock 4 sono state rese più dinamiche utilizzando un indice da 1 a 7 anziché da ID dispositivo-HID.
In linea con le suddette modifiche, il backend DualShock 4 è stato migliorato per consentire la disconnessione e la riconnessione durante il gioco.
Per i controller XInput è stato inoltre aggiunto il supporto per l’utilizzo di un singolo controller per più lettori. Mentre questa è una caratteristica di nicchia, gli utenti che hanno richiesto lo stesso ora hanno ragione di festeggiare!
Giochi
God of War 3
God of War 3 è uno dei tanti titoli che in precedenza richiedevano Accurate xfloat abilitato per risolvere problemi di fisica quando si utilizzava SPU LLVM.
Ora, grazie all’aggiunta di Approssimated xfloat di Nekotekina, questo titolo ha visto un notevole miglioramento delle prestazioni. Guarda il video qui sotto per vedere quanta performance è migliorata:
El Shaddai: Ascension of the Metatron
In precedenza, questo titolo esclusivo ha subito arresti anomali casuali durante il gameplay che ne impedivano la corretta riproduzione.
Grazie ai recenti miglioramenti di stabilità apportati a RPCS3, questo titolo ora è completamente riproducibile! Un utente dai nostri forum (correttamente chiamato Testing) ha terminato questo gioco su RPCS3 senza grossi problemi.
WET
Questo mese l’esclusivo titolo per console WET è entrata nella categoria Playable! Con i miglioramenti apportati all’emulatore, i problemi grafici e gli arresti anomali che in precedenza affliggevano questo titolo sono stati risolti. Ricordatevi di abilitare la Strict Rendering Mode per correggere lo sfarfallio dello sfondo.
Motorstorm 3D Rift
Questo mese, l’esclusivo Motorstorm 3D Rift per PlayStation 3 è stato trovato ingame. In precedenza questo titolo si arrestava in modo anomalo dopo i menu. Con questo, tutti i titoli della serie MotorStorm raggiungono l’ingame! Anche se questo gioco ha prestazioni decenti, presenta pochi problemi grafici che lo impediscono di essere riproducibili.
ModNation Racers
Grazie all’implementazione del supporto per l’emulazione della console DECR di elad335, ModNation Racers ora va ingame! Tuttavia, il gioco soffre di bassi livelli di prestazioni e problemi grafici che ne impediscono il corretto gioco.
Golden Axe: Beast Rider
Golden Axe: Beast Rider è l’ennesima esclusiva per console che è stata trovata in progresso questo mese. Entro una settimana da questa scoperta, l’utente Bnd_ps3 dei nostri forum è riuscito a completare il gioco su RPCS3.
Tuttavia, dalla sua esperienza, il gioco soffre soffre ancora di blocchi casuali e problemi grafici che ne impediscono la classificazione come giocabile. Ecco alcuni filmati di gameplay per vedere come si svolge attualmente questo gioco:
Titoli cellCamera
Grazie a Megamouse che ha corretto un controllo errato che ha portato a incongruenze in cellCamera, i vari titoli che hanno richiesto la PlayStation Eye ora progrediscono ulteriormente. Operation Creature Feature e The Trials of Topoq sono riusciti a raggiungere le intro mentre Aqua Vita è andato ingame!
Tuttavia, sarebbe necessaria una corretta emulazione di PlayStation Eye per poter classificare questi giochi come giocabili.
Everybody’s Golf 6 (Hot Shots Golf: World Invitational)
Se sei un appassionato di sport e consideri il golf uno sport, allora abbiamo delle ottime notizie per te! L’ultima uscita della serie Everybody’s Golf per PlayStation 3 ora va ingame. Mentre il gioco sembra visivamente stupendo, le prestazioni sono troppo basse per considerare questo titolo come giocabile.
NCAA March Madness 08
Se non consideri il golf uno sport, non preoccuparti, questo ha visto per la prima volta il classico progresso di NCAA March Madness 08.
Tuttavia, le prestazioni durante il gameplay sono basse anche su hardware di fascia alta. Ulteriori ottimizzazioni degli emulatori sono necessarie per ottenere prestazioni riproducibili da questo titolo.
Natsuiro High School: Seishun Hakusho
Con i miglioramenti di precisione multipli apportati all’emulatore negli ultimi mesi, sono stati trasferiti molti titoli da Loadable direttamente in Ingame.
Uno di questi titoli è Natsuiro High School: Seishun Hakusho. Sebbene il gioco abbia generalmente buone prestazioni e grafica, alcune aree riducono notevolmente l’FPS, mantenendo questo titolo dall’essere riproducibile.
Mobile Suit Gundam: Side Stories
Per tutti i fan di mecha anime in giro, questo mese ha visto due titoli del genere andare ingame per la prima volta questo mese. Il primo è Mobile Suit Gundam: Side Stories che è una raccolta rimasterizzata di storie secondarie di titoli di vecchia generazione.
Mentre questo titolo è relativamente stabile, soffre di prestazioni ridotte e di alcuni problemi grafici minori.
Rinne no Lagrange: Kamogawa Dream Match
Il secondo titolo di mecha è stato il titolo esclusivo di PS3 Rinne no Lagrange che è stato trovato giocabile questo mese!
Altri miglioramenti
Ci sono state numerose altre richieste di pull durante il mese che non sono riuscite a raggiungere la sezione Major Improvements.
Abbiamo raccolto un elenco di tutti questi miglioramenti qui e abbiamo allegato una breve panoramica a ciascuno di essi.
Assicurati di controllare i link forniti, dato che le pagine GitHub di solito rivelano ulteriori dettagli, così come i cambiamenti del codice stess0. Per vedere l’elenco completo delle richieste di pull direttamente su GitHub, clicca qui.
Potrete scaricare la versione più recente dell’emulatore collegandovi a questo indirizzo per PC Windows e Linux. Se vi piace potrete anche contribuire allo sviluppo con una piccola donazione sul Patreon.