Metal es una API gráfica y de cómputo de bajo nivel de Apple que proporciona acceso directo a la GPU en iOS, macOS y tvOS. Reemplaza a OpenGL y OpenCL, ofreciendo una sobrecarga mínima de CPU y un rendimiento predecible. Según Apple WWDC (2025), Metal se utiliza en el 98% de las aplicaciones con renderizado por GPU en el ecosistema Apple.
Puntos Clave
Metal es una API de bajo nivel para trabajar con la unidad de procesamiento gráfico (GPU), presentada por Apple en 2014 junto con iOS 8 y OS X Yosemite. Metal fue creado como reemplazo de OpenGL y OpenCL con el objetivo de reducir la sobrecarga de la CPU y proporcionar un acceso más directo al hardware de la GPU en dispositivos Apple.
A diferencia de OpenGL, donde el controlador realiza muchas comprobaciones y transformaciones en la CPU, Metal utiliza un modelo de gestión explícita de recursos. El desarrollador controla la asignación de memoria, la sincronización y el envío de comandos a la GPU, lo que ofrece hasta un 50% de mejora de rendimiento respecto a OpenGL ES en el mismo hardware.
Metal es compatible con todos los chips Apple desde A7 (2013) hasta M4 Ultra (2025). La API evoluciona constantemente: Metal 3 (2022) añadió soporte para mesh shaders y trazado de rayos, Metal 3.1 (2023) — uso compartido rápido de recursos entre CPU y GPU, y Metal 4 (2025) — aceleración hardware de redes neuronales en GPU con soporte FP8 e INT4.
La primera versión de Metal (2014) proporcionaba una API básica para renderizado gráfico en iOS. Metal 2 (2017) añadió compute shaders y Metal Performance Shaders. Metal 3 (2022) introdujo MetalFX Upscaling — el propio escalado de Apple para juegos, competidor de NVIDIA DLSS y AMD FSR. MetalFX ofrece hasta 2x de mejora de rendimiento en Mac con M2.
Metal 4 (2025) se centró en el aprendizaje automático y el trazado de rayos. Según Apple (2025), Metal 4 en M4 Ultra ofrece hasta 80 TFLOPS en tareas de cómputo en FP16 y es compatible con decodificación hardware AV1. Metal ahora también es compatible con Apple Vision Pro a través del servicio compositor para renderizar contenido inmersivo.
La arquitectura de Metal se basa en el concepto de gestión explícita: el desarrollador crea objetos MTLDevice (dispositivo), MTLBuffer (búferes de datos), MTLTexture (texturas) y MTLCommandQueue (cola de comandos). A diferencia de OpenGL, donde el estado se almacena en el contexto, Metal utiliza objetos de estado que se compilan por adelantado.
MTLDevice representa una GPU física o virtual. Todos los recursos de Metal se crean a través de este objeto: búferes, texturas, librerías de shaders, pipelines. En sistemas con múltiples GPUs (Mac Pro) se puede seleccionar un dispositivo específico. El método supportsFamily: verifica la compatibilidad de funciones: trazado de rayos, mesh shaders, MetalFX.
import Metal
// Obteniendo el dispositivo GPU
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal no soportado")
}
// Verificando capacidades
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // "Apple M4 Pro"
let maxBufferSize = device.maxBufferLength
La propiedad maxBufferLength determina el tamaño máximo de búfer compatible con el dispositivo. En Apple Silicon con Unified Memory el límite es de hasta 128 GB (en M4 Ultra). Esto permite trabajar con grandes conjuntos de datos para ML y computación científica sin segmentación de búferes. El dispositivo también gestiona el pool de memoria a través de MTLHeap.
MTLBuffer — una región de memoria contigua accesible por la GPU. Los búferes se utilizan para datos de vértices, matrices, variables uniform. Modos: shared (acceso CPU + GPU en memoria unificada), private (solo GPU, más rápido), managed (para GPUs discretas, con sincronización). En Apple Silicon se recomienda shared por simplicidad.
MTLTexture — un array multidimensional de píxeles para texturas y render targets. Soporta texturas 1D, 2D, 3D, cube y array. Formatos: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (comprimido), profundidad (depth32Float) y stencil. Los flags Texture Usage indican cómo se usará la textura: renderizado, lectura de shaders, copia.
MTLLibrary — una colección de funciones GPU compiladas (shaders). Una librería puede crearse a partir del código fuente MSL (Metal Shading Language) en tiempo de ejecución o precompilarse e incluirse en el bundle (.metallib). Se recomienda la precompilación para eliminar retrasos en la inicialización.
MTLFunction representa una función shader específica. Los vertex shaders, fragment shaders, compute kernels y mesh shaders se crean a través de la librería. Las funciones se almacenan en caché en la GPU y se reutilizan entre fotogramas. Los argumentos de shaders se pasan a través de búferes y slots de textura con vinculación por índice.
El renderizado en Metal se organiza a través de colas de comandos asíncronas. El desarrollador crea un MTLCommandBuffer, codifica en él comandos de renderizado o cómputo y lo envía a MTLCommandQueue. La GPU ejecuta los comandos secuencialmente mientras la CPU puede continuar trabajando. La sincronización se realiza mediante semáforos o completionHandler.
MTLCommandQueue — una cola de comandos creada desde MTLDevice. Una aplicación puede tener múltiples colas para gráficos, cómputo y copia. Cada cola garantiza la ejecución secuencial de comandos. MTLCommandBuffer — un contenedor para un lote de trabajo de GPU. Después de la codificación, se envía y ejecuta en la GPU.
// Bucle principal de renderizado
let commandQueue = device.makeCommandQueue()!
guard let commandBuffer = commandQueue.makeCommandBuffer()
else { return }
guard let descriptor = currentDrawable.texture.makeRenderPassDescriptor(
attachment: 0
) else { return }
let encoder = commandBuffer.makeRenderCommandEncoder(
descriptor: descriptor
)!
encoder.setRenderPipelineState(pipelineState)
encoder.drawPrimitives(type: .triangle,
vertexStart: 0, vertexCount: 36)
encoder.endEncoding()
commandBuffer.present(currentDrawable)
commandBuffer.commit()
El método drawPrimitives ejecuta el renderizado de geometría. El parámetro vertexCount especifica el número de vértices. Se crea un nuevo command buffer para cada fotograma. Present sincroniza el renderizado con el VSync de la pantalla. Metal gestiona automáticamente la sincronización con la pantalla a través de CAMetalLayer.
MTLRenderPipelineState — un estado de pipeline de renderizado compilado que incluye vertex y fragment shaders, configuración de depth-stencil, blending y formato de píxeles de salida. Crear un pipeline state es una operación costosa, por lo que los objetos se almacenan en caché y se reutilizan. Se crean diferentes pipeline states para diferentes combinaciones de shaders.
Metal 3.1 introdujo renderizado rápido mediante Immutable Samplers que se almacenan en caché en la GPU para acelerar el texture sampling. Metal soporta hasta 31 texturas por slot de shader en Apple Silicon. En dispositivos antiguos con A13 e inferiores el límite se reduce a 16 slots. Se recomienda combinar texturas en Texture Atlases para reducir el número de muestras.
Metal Shading Language (MSL) es un lenguaje de programación de shaders basado en C++14 con extensiones para cómputo en GPU. MSL soporta templates, sobrecarga de funciones, espacios de nombres y aritmética de direcciones. Los shaders se compilan en código GPU binario a través del backend LLVM de Apple.
Vertex shader procesa cada vértice: transforma coordenadas del espacio mundial al espacio de pantalla, calcula normales y pasa datos al fragment shader. Fragment shader calcula el color de cada píxel: aplica texturas, iluminación y efectos de post-procesado.
// Vertex shader de Metal
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
};
struct VertexOut {
float4 position [[position]];
float3 worldNormal;
};
vertex VertexOut vertexMain(
VertexIn in [[stage_in]],
constant float4x4 &mvp [[buffer(0)]]
) {
VertexOut out;
out.position = mvp * float4(in.position, 1.0);
out.worldNormal = in.normal;
return out;
}
Los atributos [[attribute(N)]] corresponden a formatos de vértice especificados en MTLVertexDescriptor. El búfer [buffer(0)] pasa la matriz MVP como variable uniform. La posición del vértice debe marcarse con [[position]] para pasarla al rasterizador. Todos los tipos vectoriales de MSL — float2, float3, float4 — se mapean a registros hardware de la GPU.
Compute shader (kernel) es una función GPU ejecutada fuera del pipeline gráfico. Las funciones kernel se marcan con el calificador kernel y se ejecutan en hilos (threads) organizados en grupos (threadgroups). Los compute shaders se utilizan para procesamiento de imágenes, simulación de física, ML y post-procesado.
// Kernel de cómputo para desenfoque de imagen
kernel void blurKernel(
texture2d<half> input [[texture(0)]],
texture2d<half> output [[texture(1)]],
constant float &radius [[buffer(0)]],
uint2 gid [[thread_position_in_grid]]
) {
if (gid.x >= input.get_width() ||
gid.y >= input.get_height()) { return; }
half4 color = input.read(gid);
output.write(color, gid);
}
El parámetro gid [[thread_position_in_grid]] contiene el índice único del hilo. Texture2D<type> se especializa por tipo de píxel: half (FP16), float (FP32). Los compute kernels pueden ejecutarse con un tamaño de grid de más de mil millones de hilos en M4 Ultra. El tamaño máximo de threadgroup es de 1024 hilos en GPU Apple Silicon.
Metal Performance Shaders (MPS) es una librería de funciones GPU optimizadas proporcionada por Apple. MPS incluye redes neuronales convolucionales (MPSNNConvolution), multiplicación de matrices (MPSMatrixMultiplication), ordenación (MPSParallelSort) y procesamiento de imágenes (MPSImageGaussianBlur). Todas las funciones están optimizadas para GPUs Apple específicas.
MetalFX es una tecnología de escalado y suavizado, competidora de NVIDIA DLSS y AMD FSR. MetalFX ofrece dos modos: Spatial (escalado espacial mediante algoritmo FSR 2) y Temporal (escalado temporal con motion vectors). MetalFX Temporal ofrece una calidad cercana al 4K nativo desde un renderizado en 1440p.
Según Apple (2025), MetalFX Temporal en M4 Max ofrece hasta 3x de mejora de rendimiento en juegos manteniendo una calidad visualmente indistinguible de la resolución nativa. MetalFX funciona en cualquier GPU compatible con Metal 3, sin núcleos tensor dedicados. La integración de MetalFX en un proyecto requiere unas 50 líneas de código.
Ray Tracing en Metal 3 es compatible con chips M3, M4 y A17 Pro con unidades de aceleración hardware (Ray Tracing Accelerators). Metal proporciona MTLAccelerationStructure para construir BVH y MTLIntersectionFunction para la intersección de rayos en shaders. Escenas masivas con millones de triángulos se compilan en BVH en milisegundos.
Según Apple (2025), el trazado de rayos por hardware en M4 Ultra realiza hasta 40 mil millones de intersecciones de rayos por segundo (Giga rays/s). Esto es 4 veces más rápido que el trazado por software en M1 Ultra. Metal RT soporta intersection queries, geometría dinámica y Motion Blur para animaciones realistas. Los reflejos y sombras con trazado de rayos funcionan en tiempo real a 60 FPS.
Unified Memory es la arquitectura de Apple Silicon donde la CPU y la GPU comparten la misma memoria física. Metal en Apple Silicon no requiere copiar datos entre CPU y GPU: MTLBuffer en modo shared es accesible para ambos procesadores sin copia. Esto elimina el principal cuello de botella de las GPUs tradicionales (transferencias PCIe).
Zero-Copy en Metal permite que la CPU escriba datos en un búfer y la GPU los lea sin demoras. Según Apple (2025), esto ofrece una mejora de rendimiento del 30–50% respecto a las GPUs discretas en juegos y tareas de ML. Para GPUs discretas (Mac Pro con Radeon) Metal soporta modo managed con sincronización automática mediante memory barriers.
Preguntas Frecuentes
Metal es la API GPU de bajo nivel de Apple que proporciona una sobrecarga mínima de CPU. Se utiliza para gráficos 3D, cómputo de ML, procesamiento de imágenes y simulaciones en iOS, macOS y tvOS. Reemplaza a OpenGL y OpenCL.
Metal solo funciona en dispositivos Apple, integrado con Unified Memory y Metal Performance Shaders. Vulkan es una API multiplataforma para Windows, Android y Linux. Ambos APIs son comparables en rendimiento, pero Metal tiene menor sobrecarga en Apple Silicon.
Sí, con Metal 3 en chips M3, M4 y A17 Pro está disponible el trazado de rayos por hardware. Metal proporciona MTLAccelerationStructure y soporte de intersection queries en shaders. Rendimiento — hasta 40 Giga rays/s en M4 Ultra.
MetalFX es la tecnología de escalado de Apple con modos Spatial y Temporal. Funciona en cualquier GPU con Metal 3, sin núcleos tensor. Ofrece hasta 3x de mejora de rendimiento con calidad cercana al 4K nativo en M4 Max.
La barrera de entrada es más alta que SceneKit o Unity debido a la gestión de recursos de bajo nivel. Apple proporciona Metal Sample Code y tutoriales en developer.apple.com. El renderizado básico de un triángulo requiere unas 200 líneas de código.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también