Guía del Desarrollador
Una referencia técnica para contribuidores arquitectura, cores de emulación, pipeline de compilación y análisis profundos
Primeros Pasos
Para contribuir a TruchiEmu, necesitarás:
- macOS: 14.0 (Sonoma) o posterior con Swift 5.9+
- Xcode: Última versión estable
- XcodeGen:
brew install xcodegen - Estándar C++: gnu++17 / gnu17
Consulta la guía Compilar desde el Código Fuente para una configuración paso a paso completa y la guía de Contribuir para convenciones y flujo de trabajo.
Pipeline de Compilación
TruchiEmu usa XcodeGen para gestionar la estructura del proyecto dinámicamente desde project.yml. Esto previene conflictos de fusión en el archivo .xcodeproj.
Flujo de Trabajo Estándar de Compilación
# 1. Clonar el repositorio
git clone https://github.com/JuanchoGithub/truchiemu.git
cd truchiemu
# 2. Generar el proyecto Xcode
xcodegen generate
# 3. Compilar
xcodebuild -project TruchiEmu.xcodeproj -scheme TruchiEmu -configuration Debug build
O ábrelo en Xcode: open TruchiEmu.xcodeproj y presiona ⌘+B.
Agregar Archivos Fuente
Los nuevos archivos fuente bajo TruchiEmu/ y recursos bajo TruchiEmu/Resources/ se incluyen automáticamente mediante rutas recursivas en project.yml. Simplemente agrega tu archivo y ejecuta xcodegen generate para regenerar el proyecto Xcode.
Si necesitas excluir un directorio de la compilación, edita project.yml y regenera.
⚠️ Importante: Solo edita project.yml cuando agregues o elimines directorios de la compilación. Los nuevos archivos fuente dentro de directorios existentes se detectan automáticamente.
Arquitectura del Proyecto
TruchiEmu sigue una arquitectura modular que separa el motor de emulación de la interfaz nativa de macOS.
Capa de Aplicación
TruchiEmu/App/ Punto de entrada de la aplicación, gestión de ventanas y ContentView.
Motor Core
TruchiEmu/Core/Engine/ Objective-C++ y C mixtos. Interactúa con libretro mediante un bridging header.
Capa SwiftUI
TruchiEmu/Views/ y TruchiEmu/Features/ Toda la interacción del usuario y presentación visual.
Capa de Servicios
TruchiEmu/Services/ Lógica de negocio: directorios de guardado, identificación de ROMs, integraciones API.
Capa de Datos
TruchiEmu/Core/Models/ Modelos SwiftData para la biblioteca de juegos, configuración y persistencia.
Utilidades Compartidas
TruchiEmu/Shared/ Código transversal: gestor de temas, tokens de diseño, caché de imágenes.
Para una visualización interactiva de cómo estas capas se comunican durante flujos de trabajo comunes, consulta la página de Flujos de Arquitectura de la App.
Sistema de Cores de Emulación
TruchiEmu usa una arquitectura basada en cores impulsada por libretro, permitiendo soporte para múltiples backends de emulación. Cada core es un motor de emulación independiente que funciona como un plug-in.
Cómo Funcionan los Cores
- Especializados: Cada core está orientado a un sistema o familia de sistemas
- Desarrollados Independientemente: Los cores provienen de la comunidad libretro
- Actualizaciones Regulares: Los cores se actualizan independientemente de TruchiEmu
- Intercambiables: Se soportan múltiples cores para el mismo sistema
Asignaciones de Core Predeterminadas
| Sistema | Core | Precisión | Rendimiento |
|---|---|---|---|
| NES/Famicom | Mesen | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| SNES | Snes9x | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Game Boy/Color | Gambatte | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Game Boy Advance | mGBA | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Genesis/Mega Drive | Genesis Plus GX | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Nintendo 64 | ParaLLEl | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| PlayStation 1 | DuckStation | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Arcade | MAME 2003+ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
Gestión de Cores
El Descargador de Cores integrado proporciona instalación, actualización y retroceso con un clic para todos los cores. Las opciones por core incluyen ajustes de video y audio, y perfiles de configuración guardables. El bridge Swift ↔ ObjC para la comunicación de cores se encuentra en LibretroBridge.mm / LibretroBridgeSwift.swift.
Bridge Swift ↔ ObjC
El motor de emulación está escrito en Objective-C++/C para acceso directo a la API de libretro. El código Swift se comunica con él a través de LibretroBridge.mm / LibretroBridgeSwift.swift, con símbolos expuestos a través de TruchiEmu-Bridging-Header.h.
Integración de Estados de Guardado
El sistema de cores se integra con SaveStateManager para instantáneas comprimidas con LZ4 con cabeceras TCS2, y SaveDirectoryManager para resolución de rutas. Los guardados de batería son gestionados automáticamente por el core de emulación.
Análisis Profundo: Para un recorrido detallado de una corrección de bug real involucrando ciclos de vida de opciones de core, consulta Depuración de Guardados VMU de Dreamcast.
Pipeline de Shaders
El sistema de shaders usa shaders Metal personalizados compilados en tiempo de ejecución, ejecutándose directamente en la GPU a través del framework Metal de Apple.
Componentes Clave
- Compilador de Shaders: Compilación en tiempo de ejecución de archivos shader
.metalcon manejo de errores - Sistema de Parámetros: Ajuste en tiempo real de uniforms de shader mediante controles SwiftUI
Archivos de Shaders
Los shaders Metal se encuentran en TruchiEmu/Core/Shaders/. Los directorios slang/, internal/ y all_shaders.metal están excluidos de la compilación de Xcode estos son recursos cargados en tiempo de ejecución desde TruchiEmu_Resources/core_shaders/.
Características de Rendimiento
Passthrough, Smooth Upscale y Vignette tienen un impacto mínimo en la GPU. Los shaders CRT (Multipass, Lottes) y simulaciones LCD usan más recursos de GPU.
Sistema de Temas
El motor de temas proporciona tematización de color acentuado en toda la interfaz de la app, impulsado por un pipeline de tres tipos principales.
Arquitectura
- AccentColorTheme Enum con 16 casos curados (más
.custom). Cada uno define colores accent, dimmed (84%), dark (70%) y secondary para modos claro y oscuro. Incluye un sistemamigratedRawValue()para temas renombrados. - ThemeManager Singleton
@MainActor ObservableObjectque posee el tema actual, modo de apariencia, color acentuado personalizado, toggle de acento en barra de herramientas y toggle de superficies tintadas. Persiste todo el estado víaAppSettings(SwiftData). - AppColors Tokens de color semántico estáticos en
DesignSystem.swiftque las vistas consumen. Auto-resuelve víaNSApp.effectiveAppearance. Variantes*ForSchemeseguras para previews disponibles. - Reinicio de App Los cambios de tema llaman
ThemeManager.relaunchApp(), generando un nuevo proceso y terminando el actual. La UI de configuración aplica esto con diálogos de confirmación e intercepción de cambios no guardados.
Agregar un Nuevo Tema
- Agrega un caso al enum
AccentColorTheme - Define accent, accentDimmed, accentDark, secondaryAccent (y variantes light/dark opcionales)
- Agrega el recurso de icono a
Assets.xcassets/ThemeIcons/ - Agrega claves de localización:
settings.theme.<name>a todos los archivos JSON de idioma - Si renombras, agrega mapeo de migración en
migratedRawValue()
Convenciones de Tematización
Todas las vistas deben usar los tokens semánticos AppColors nunca codificar valores de color en duro. Los tokens mezclan automáticamente el acento del tema actual en superficies, texto y bordes. Verifica ThemeManager.shared.toolbarAccentEnabled y tintedSurfacesEnabled al aplicar colores acentuados a iconos y superficies de fondo.
Referencia CLI
TruchiEmu proporciona una interfaz de línea de comandos para usuarios avanzados que les permite iniciar juegos y gestionar la aplicación externamente. Gestionada por CLIManager y CLILauncher en la capa de Servicios.
Iniciar una ROM
./TruchiEmu "/path/to/game.nes"
Testing y QA
Actualmente no existe un target de tests en el proyecto. Cuando se agreguen tests:
- Crea un target de tests en
project.ymly ejecutaxcodegen generate - Agrega archivos de test bajo
TruchiEmuTests/ - Enlaza el framework SwiftData en el target de tests
- Algunos tests pueden requerir acceso a la red (LaunchBox, servicios de miniaturas)