Informe de progreso 2018
CPU / Core
En el frente de emulación de CPU, MerryMage y Lioncash han sido absolutamente fenomenales. Han implementado muchas instrucciones faltantes de ARMv8 para Dynarmic , nuestro recompilador ARM, y también corrigieron muchos errores en los existentes. Debido a esto, la cantidad de veces que Yuzu tiene que retroceder a Unicorn se ha reducido y ha mejorado el rendimiento general de yuzu.
ARMS
Gracias a Hedges , la anterior GDBStub de Unicorn solo ahora también funciona con Dynarmic. GDBStub es una herramienta de depuración que ayuda a los desarrolladores a encontrar errores / errores en el código. Subv corrigió un error en la dinámica que estaba causando problemas con la administración del estado de la CPU, al evitar escribir datos en un registro.
Mejoras generales
Octopath traveler
Como Citra y yuzu comparten un código común, FearlessTobi portó varios cambios realizados en Citra a yuzu. Estas son algunas de las cosas que portó:
- Registrando la versión de yuzu - para ayudarnos a identificar la versión de yuzu del archivo de registro.
- Se agregaron teclas de acceso directo "Continuar / Pausa" y "Alternar límite de velocidad".
- Tema oscuro actualizado a la última versión.
- Se agregó información de "Fecha de compilación" al cuadro de diálogo "Acerca de".
- Soluciones para el entorno de Travis CI.
- Lista de compatibilidad de juegos agregada a yuzu.
- Muchas más optimizaciones de código y correcciones de errores menores.
DarkLordZach implementó la visualización del título del juego en la barra de título de la ventana. CaptV0rt3x portado sobre la visualización del número de versión en la barra de título.
Puyo Puyo TETRIS
OS
Lioncash corrigió una posible condición de carrera de datos en el objeto kernel, asegurando que la clase maneja sus recuentos de referencia de forma atómica.
Bayonetta
La atomicidad asegura que el cambio en el recuento de referencias sea visible para todos los hilos entre las operaciones y así garantizar que nunca se realice una carrera. Y dado que esa clase de objeto es heredada por todos los objetos kernel en yuzu, esto afectó bastante a cada objeto kernel. Aparte de esto, también optimizó el código en el programador del kernel y en la lista de filas de hilos.
The Binding of Issac
GPU
degasus , que fue responsable de la implementación del buffer de flujo en Citra, reemplazó el buffer de flujo existente en yuzu con el de Citra. Para los no iniciados, los buffers de flujo se utilizan para cargar datos de vértice a la GPU. También ha estado haciendo una gran cantidad de perfiles de código GPU y haciendo optimizaciones. Debido a esto, estamos llegando al punto en que la emulación de GPU ya no es un cuello de botella.
Además, implementó una memoria caché de búfer para evitar cargas redundantes y una memoria caché VAO (Vertex Array Object) para almacenar en caché los objetos VAO. La memoria caché del búfer funciona almacenando en caché los búferes cargados en stream_buffer y simplemente reutilizando los punteros anteriores. La memoria caché VAO funciona almacenando en caché los objetos VAO en lugar de volver a emitir todos los punteros por llamada de dibujo.
Disgaea 5
bunnei , Subv , ogniK y greggameplayer han implementado muchos formatos de textura faltantes, formatos de píxeles y objetivos de renderizado. Estas implementaciones nos permitieron avanzar en muchos juegos como One Piece, Fate Extella, Go Vacation y Xenoblade. Subv también implementó algunos formatos de buffer de profundidad y agregó soporte para pruebas de buffer de profundidad. Los búferes de profundidad se utilizan para especificar la profundidad de cada píxel, creando así varios efectos visuales.
bunnei implementó un par de atributos de vértices, agregó más modos de TLDS
texturas, implementó instrucciones de sombreado como TLDS
y SEL
, instrucciones de sombreado TEXS
fijas, máscaras de TEXS
implementadas y la textura fija no se vio bien. También realizó diversas mejoras en la memoria caché de rasterizadores y mejoró su rendimiento al evitar copias superfluas. Esto solucionó los problemas de representación en Cave Story +, Disgaea 5 y Binding of Issac. ogniK fijó glVertexAttribFormat
para enteros, que arregló los vértices de explosión en One Piece Unlimited World. Lioncash reformó, limpió e hizo mejoras / optimizaciones para el código de la GPU.
DOOM
Fire Emblem
Servicio HLE
Con la última documentación disponible en Switchbrew , hemos realizado varias correcciones de errores en nuestras implementaciones de servicios y también hemos agregado nuevos servicios. Lioncash, mailwl y Hexagon12 trabajaron en el servicio HID
(Human Interface Devices) y también hicieron algunas mejoras allí.
El servicio HID
básicamente administra los controladores. Almacena todo tipo de información relacionada con los controladores en una región de memoria compartida, de la que leemos. ogniK y bunnei arreglaron el servicio Friend
, que arregló un bloqueo en Splatoon 2 y también recibió el arranque de Retro City Rampage.
Has-Been Heroes
El servicio Friend
es principalmente para tus amigos de Nintendo Online, tu lista de amigos, etc. En esta implementación actual, siempre estamos fuera de línea y enviamos la misma respuesta (fuera de línea) al sistema y a los juegos también. El bloqueo en Splatoon 2 se corrigió porque estaba solicitando la lista de amigos y le devolvimos una respuesta de Zero (0) Friends
. No es exactamente una réplica exacta del comportamiento de Switch, pero los juegos parecen aceptar esa respuesta.
Del mismo modo, obtuvimos el arranque de Retro City Rampage porque estaba tratando de obtener la presencia del usuario y agregamos un stub en su lugar. Mailwl agregó más talones para el servicio de Account
. Por último, el servicio de Account
es principalmente para la administración de su cuenta local o usuarios registrados en el sistema.
Fantasy Hero
Cada usuario tiene un UUID (Universally Unique Identifier) único, que se genera cuando se crea una cuenta, y cada uno tiene información sobre su perfil. Esta información se referencia típicamente al guardar juegos. ogniK trabajó en la base necesaria para admitir múltiples cuentas de usuario y su gestión en el futuro. También implementó funciones para permitir la configuración del nombre de usuario y la configuración regional del Switch.
Guerreros de Hyrule
ogniK también implementó soporte para cargar fuentes compartidas en el servicio pl:u
. Como ahora bfttf
cargar fuentes bfttf
sistema, los usuarios que hayan instalado su sistema y vuelquen a yuzu obtendrán automáticamente fuentes compartidas. Para otros usuarios, ahora también puedes cargar fuentes compartidas desde archivos ttf
.
Fearlesstobi, inspirándose en la implementación de Citra, integró fuentes compartidas de fuente abierta en yuzu. Esto se puede observar claramente en las capturas de pantalla anteriores del juego: Hyrule Warriors.
Lioncash implementó los esqueletos para varios servicios nuevos como time:a
, es
, pm
, erpt
, eupld
, ldr
y muchos más.
Sistema de archivos
DarkLordZach agregó soporte para varias características, como cargar archivos cifrados NCA y XCI, mostrar íconos de juegos, analizar metadatos y hacer que el manejo de errores sea más descriptivo.
Los archivos NCA
encriptados son solo archivos de juegos en un contenedor. XCI
archivos XCI
son básicamente depósitos de gamecards en bruto. Las cartas de juego tienen 3 particiones principales. Una partición de Update
, que almacena actualizaciones del sistema, una partición Secure
, que tiene las NCAs
del juego y una partición Normal
, que simplemente almacena varios archivos. Lo que queremos es la partición Secure
. Contiene el juego NCAs
y otros metadatos también, lo cual es muy útil. XCI
archivos XCI
son relativamente fáciles de descargar en comparación con otros métodos y son muy útiles.
Al agregar soporte para cargar NCAs
y XCIs
, elimina muchos pasos innecesarios al volcar sus juegos. Antes, tenía que volcar su XCI
, luego extraer la partición Secure
, y luego extraer el NCA
en el formato para yuzu. Esto te dejó con casi 8 archivos diferentes, que son binarios y un archivo romfs. Ahora con esta característica, puede abrir directamente sus archivos NCA
o, mejor aún, sus archivos XCI
. Y debido a que los archivos XCI
incluyen metadatos adicionales, también puedes obtener iconos de juegos de ellos. Los iconos se pueden configurar para mostrar en varios tamaños dentro de yuzu.
DarkLordZach fue un paso adelante e implementó soporte para archivos NAX
(Nintendo AesXts). Con esto, puedes cargar tus juegos directamente desde la tarjeta SD de tu Switch conectándolo a tu PC. También solucionó algunos problemas con nuestra implementación anterior de VFS y también realizó otras mejoras.
Runner 3
También agregó soporte para el formato de archivo NSP
(Nintendo Submissions Package), formato BKTR
, y agregó una opción para establecer directorios NAND / SD personalizados. Como el soporte de NSP
probablemente se convertirá en el nuevo formato de elección para el homebrew de volcado avanzado y otras herramientas, agregar soporte significa menos pasos durante el volcado. NSPs
contienen todos los metadatos y también pueden contener actualizaciones / DLC del juego. Con soporte adicional para el formato BKTR
, ahora puede instalar actualizaciones del juego desde yuzu NAND o SD directamente a través de la interfaz de usuario. Él y Lioncash también trabajaron en la refacturación del código del Sistema de Archivos e hicieron optimizaciones siempre que fue posible.
Audio
A medida que yuzu progresaba a un ritmo increíblemente rápido, una de las características más buscadas era la salida de audio. Discutimos esto en nuestro informe anterior que el Switch tiene 2 métodos de salida de audio AudRen
y AudOut
. Primero, bunnei emuló AudOut
sin producir realmente salida de audio. Esto se usó solo para un puñado de juegos como One Piece, Snipperclips, Minecraft, etc.
Emular el estado de AudOut
sin realmente producir audio fue suficiente para que estos juegos entren en el juego real. Esto se debe a que los juegos a menudo esperan la señalización para indicar que un clip de audio ha terminado de reproducirse. Podemos señalar correctamente este estado sin reproducir el sonido, permitiendo que estos juegos continúen funcionando. Más tarde agregó la salida de audio, basada en cubeb , para juegos que usaban el servicio AudOut
.
Human: Fall Flat
ogniK hizo la ingeniería inversa y ayudó con las implementaciones HLE (High Level Emulation) de los servicios Audout
y AudRen
. También agregó la biblioteca de opus e implementó hwopus
servicio de hwopus
, que usa AudOut
y AudRen
, que AudRen
Pokemon Quest y Touhou. Como aún no teníamos AudRen
, solo funcionaba con juegos que usaban AudOut
.
Tomó un tiempo pero Bunnei finalmente implementó el método Audren
, que obtuvo salida de audio para la mayoría de los juegos como Cave Story +, Binding of Issac, Super Mario Odyssey, Puyo Puyo Tetris y muchos más. La implementación original de bunnei de la salida de audio, con backend de cubeb, solo soportaba 48000Hz de dos canales, que es el formato de salida de audio más común. Esto funciona bien para los juegos de AudOut
, pero los juegos que usan AudRen
podrían usar tasas de muestreo variables. Debido a que siempre estábamos reproduciendo todos los sonidos a 48000 Hz, a pesar de que funcionaba correctamente, los sonidos serían audibles, pero a menudo sonarían acelerados o con un tono incorrecto.
One Piece Unlimted World
MerryMage solucionó este problema implementando la interpolación de audio y el filtrado, lo que nos permitió volver a muestrear estos sonidos desde su frecuencia de muestreo original a 48000Hz. La interpolación de audio es un método para hacer que el audio digital suene mejor de lo que realmente es y el filtrado ayuda a reducir los artefactos que surgen cuando se remuestrea el audio. Ella también encontró y solucionó problemas de enhebrado con el backend de cubeb. Lioncash hizo muchas refacciones e hizo múltiples mejoras / optimizaciones al código de Audio.
Super Mario Odyssey
Como resultado, Super Mario Odyssey (SMO) ha sido capaz de entrar al juego por bastante tiempo. Sin embargo, debido al rendimiento realmente malo y algunos bloqueos ocasionales del emulador, nadie realmente lo estaba probando.
bunnei hizo un gran avance al usar juegos guardados (arrojados desde una Consola Switch) que le permitieron ingresar al juego mucho más rápido, reparar fallas y mejorar la renderización. Al poder agilizar este proceso, el equipo pudo obtener rápidamente la primera representación 3D trabajando en SMO, la cabeza de Mario en la pantalla de título. A partir de ahí, pudimos hacer funcionar el renderizado en el juego, aunque con gráficos muy imprecisos y mucha variación dependiendo del reino.
Super Mario Odyssey (dentro del juego)
bunnei y khang06 implementaron varios objetivos de renderizado y formatos de textura necesarios para arrancarlo. bunnei implementó la instrucción shader XMAD
, manejo mejorado de la instrucción shader KIL
, manejo mejorado de atributos de vértices desconocidos en shaders, agregó flotantes más precisos para shaders, arregló el tamaño del constbuffer, agregó algunos tipos de atributos de vértices y superó las funciones de servicio AM
HLE .
Subv implementó las instrucciones de sombreado SSY
y SYNC
, implementó factores de fusión alternativos y mejoró el manejo de atributos de vértices inválidos o no establecidos. SSY
y SYNC
son instrucciones para el flujo de control en los sombreadores. SSY
le dice a la unidad de ejecución del sombreador dónde saltar cuando se ejecuta una SYNC
.
Super Mario Odyssey (dentro del juego)
Actualmente SMO entra al juego y los menús se ejecutan a toda velocidad. Sin embargo, las velocidades del juego pueden variar según lo que esté a la vista y las especificaciones de hardware de tu PC. Es muy complicado, pero puedes jugarlo. La salida de audio funciona bien cuando está a toda velocidad. Usar un juego de salvar ayuda mucho. Hay softlocks al azar al hacer la transición a nuevas áreas; por lo tanto, no se puede jugar.
Breath of the Wild
The Legend of Zelda: Breath of the Wild, es un juego particularmente interesante y emocionante para emular en yuzu. Si bien ya puedes jugar a este juego en cemu usando la emulación de Wii U, creemos que es importante tener también una alternativa de código abierto. Además, BotW es un juego muy gráfico y complicado de emular, por lo que es emocionante usarlo como una oportunidad para mejorar nuestro renderizado.
The legend of Zelda: Breath of the Wild
El bloqueo aleatorio fue uno de los principales problemas que enfrentamos al tratar de hacer funcionar este juego. Tras la depuración, descubrimos que había algunos problemas con el enhebrado en el kernel. Por ejemplo, hubo un montón de condiciones de carrera cuando se ejecutaba en modo multinúcleo, nuestro tiempo central era impreciso para múltiples núcleos, y había una posibilidad de que los hilos se duplicaran.
Subv corrigió estos problemas eliminando la mayoría de las condiciones de carrera, usando una cantidad aproximada de tics al avanzar el tiempo central, y agregó más validaciones para asegurarse de que los hilos no se estaban duplicando. Antes de los cambios, los cuatro núcleos incrementaban el contador global de ticks
independiente, lo que provocaba que fuera aproximadamente 4 veces más de lo que debería haber sido.
The legend of Zelda: Breath of the Wild
Esto hizo que los juegos pensaran que el momento no funcionaba bien. La razón de esto fue que el contador de ticks no era seguro para subprocesos y lo estábamos incrementando más de lo que deberíamos tener. Esto se solucionó amortizando la marca incrementando dividiendo cada incremento por la cantidad de núcleos (4). Esto no es del todo exacto, ya que no todos los núcleos están activos todo el tiempo, pero debería ser mejor que antes.
Bunnei implementó algunos objetivos de renderización necesarios, formatos de textura, tipos de atributos de vértices y algunas topologías primitivas. Actualmente, BotW va dentro del juego pero tiene gráficos masivamente rotos. Sin embargo, el mapa, los objetos, los modelos 3D de Bestias divinas y el Castillo de Hyrule se muestran correctamente.
Conclusión
Finalmente, nos gustaría agradecer a todos nuestros valiosos colaboradores que han trabajado duro para mejorar yuzu. yuzu necesita colaboradores como ellos para ser lo mejor posible. También nos gustaría agradecer a nuestros generosos patrocinadores por apoyar nuestros esfuerzos en este proyecto.
Kamiko
Soldam