Un nuevo proyecto de fans, bo2-mac, permite que Call of Duty: Black Ops II se ejecute de forma nativa en Apple Silicon convirtiendo el código de máquina x86 original del juego a código ARM64 de antemano. A diferencia de las capas de compatibilidad tradicionales como Wine, que traducen las llamadas de Windows en tiempo de ejecución, este proyecto garantiza que el juego se ejecute como código nativo en un solo proceso, logrando entre 51 y 60 fotogramas por segundo en un chip Apple M1.

Logotipo del proyecto bo2-mac y estadísticas de rendimiento para Apple M1
El proyecto bo2-mac logra un rendimiento nativo en Apple Silicon, alcanzando hasta 60 fotogramas por segundo en varios modos de juego.github.com

Esta imagen proporciona una visión general de alto nivel de los objetivos del proyecto y los puntos de referencia de rendimiento logrados en el hardware Apple M1.

Diagrama del elevador Remill y LLVM 17
El proyecto utiliza Remill para elevar las funciones x86 a LLVM IR para su recompilación.github.com

Esta visualización ilustra el primer paso del flujo de recompilación mencionado en la descripción técnica.

El flujo de recompilación

El proyecto bo2-mac transforma tres ejecutables de Windows x86 —la campaña, Zombies y el modo multijugador— en código nativo ARM64. El proceso involucra cinco pasos: verificar la versión de Steam mediante SHA-256, catalogar y elevar funciones a LLVM IR usando Remill, 'plegar' ese IR para incluir accesos de memoria del huésped, implementar un entorno de ejecución Win32 y gestionar los hilos del huésped como corrutinas.

Rendimiento en Apple M1: Campaña 51–60 fps; Zombies 57–60 fps; Multijugador 53–60 fps
Rendimiento en Apple M1github.com

Gráfico de HN Digest basado en cifras de github.com; los valores se muestran como en la fuente.

Para mantener el rendimiento, el proyecto reescribe el IR elevado antes de pasarlo a clang -O2. Esto asegura que las lecturas y escrituras del huésped estén integradas y que las secuencias de bloqueo se conviertan en atómicos de hardware. Debido a que ARM no cumple con el Total Store Order (TSO), el proyecto utiliza barreras de memoria reales para gestionar estas operaciones.

“No hay Wine ni JIT: el juego se ejecuta como código nativo, en un solo proceso.”

— GitHub - adrbn/bo2-mac: Call of Duty: Black Ops II statically recompiled from 32-bit x86 Windows to native ARM64 macOS:

Traducción de gráficos y entorno de ejecución

Debido a que el juego depende de Direct3D 11, el proyecto implementa una capa COM falsa que traduce estas llamadas al framework Metal de Apple. La traducción de sombreadores es gestionada por HLSLcc, una biblioteca en C++ que convierte sombreadores DXBC en código compatible con Metal.

Diagrama de traducción de renderizador D3D11 a Metal
El proyecto implementa una capa personalizada para traducir las llamadas gráficas de Direct3D 11 al framework Metal de Apple.github.com

Este diagrama explica el mecanismo de traducción de gráficos descrito en la sección de Traducción de gráficos y entorno de ejecución.

Otros componentes del sistema también se portan a frameworks nativos de macOS. XAudio2 se mapea a CoreAudio y los videos se decodifican usando libvpx. El proyecto también incluye un respondedor local para simular el servicio Demonware, permitiendo que el juego maneje solicitudes de lobby y almacenamiento sin una conexión a internet.

Compromisos técnicos y limitaciones

Aunque el juego se ejecuta de forma nativa, actualmente está limitado al juego local. No hay soporte para servicios en línea, LAN o modos cooperativos, ya que el proyecto depende de un respondedor local para simular el backend del juego. Además, las reglas de las partidas para Zombies y el modo multijugador están escritas a medida en un entorno de 'sala limpia', lo que significa que el comportamiento puede diferir ligeramente del juego original.

El proyecto también enfrenta restricciones de hardware; el desarrollador informó que la Mac se calienta mucho durante sesiones largas, alcanzando temperaturas entre 111 y 116 °C en un chip M1. Además, aunque la conversión es exitosa, el juego sigue siendo una experiencia local que requiere que el usuario posea la copia original de Steam para construir la aplicación.