Metal là API đồ họa và tính toán cấp thấp của Apple, cung cấp quyền truy cập trực tiếp vào GPU trên iOS, macOS và tvOS. Nó thay thế OpenGL và OpenCL, mang lại chi phí CPU tối thiểu và hiệu suất có thể dự đoán trước. Theo Apple WWDC (2025), Metal được sử dụng trong 98% ứng dụng có kết xuất GPU trong hệ sinh thái Apple.
Những điểm chính
Metal là API cấp thấp để làm việc với bộ xử lý đồ họa (GPU), được Apple giới thiệu vào năm 2014 cùng với iOS 8 và OS X Yosemite. Metal được tạo ra để thay thế OpenGL và OpenCL nhằm giảm chi phí CPU và cung cấp quyền truy cập trực tiếp hơn vào phần cứng GPU trên các thiết bị Apple.
Không giống như OpenGL, nơi trình điều khiển thực hiện nhiều kiểm tra và biến đổi trên CPU, Metal sử dụng mô hình quản lý tài nguyên rõ ràng. Nhà phát triển kiểm soát việc cấp phát bộ nhớ, đồng bộ hóa và gửi lệnh GPU, mang lại hiệu suất cải thiện lên đến 50% so với OpenGL ES trên cùng một phần cứng.
Metal hỗ trợ tất cả chip Apple từ A7 (2013) đến M4 Ultra (2025). API không ngừng phát triển: Metal 3 (2022) thêm hỗ trợ mesh shader và dò tia, Metal 3.1 (2023) — chia sẻ tài nguyên nhanh giữa CPU và GPU, và Metal 4 (2025) — tăng tốc phần cứng mạng nơ-ron trên GPU với hỗ trợ FP8 và INT4.
Phiên bản đầu tiên của Metal (2014) cung cấp API cơ bản cho kết xuất đồ họa trên iOS. Metal 2 (2017) thêm compute shader và Metal Performance Shaders. Metal 3 (2022) giới thiệu MetalFX Upscaling — công nghệ nâng cao độ phân giải của Apple cho game, cạnh tranh với NVIDIA DLSS và AMD FSR. MetalFX mang lại cải thiện hiệu suất lên đến 2x trên Mac với M2.
Metal 4 (2025) tập trung vào học máy và dò tia. Theo Apple (2025), Metal 4 trên M4 Ultra đạt tới 80 TFLOPS trong các tác vụ tính toán ở FP16 và hỗ trợ giải mã AV1 bằng phần cứng. Metal hiện cũng được hỗ trợ trên Apple Vision Pro thông qua dịch vụ compositor để kết xuất nội dung nhập vai.
Kiến trúc Metal được xây dựng xoay quanh khái niệm quản lý rõ ràng: nhà phát triển tạo đối tượng MTLDevice (thiết bị), MTLBuffer (bộ đệm dữ liệu), MTLTexture (kết cấu) và MTLCommandQueue (hàng đợi lệnh). Không giống như OpenGL, nơi trạng thái được lưu trong ngữ cảnh, Metal sử dụng các đối tượng trạng thái được biên dịch trước.
MTLDevice đại diện cho GPU vật lý hoặc ảo. Tất cả tài nguyên Metal được tạo thông qua đối tượng này: bộ đệm, kết cấu, thư viện shader, pipeline. Trên hệ thống có nhiều GPU (Mac Pro) có thể chọn thiết bị cụ thể. Phương thức supportsFamily: kiểm tra hỗ trợ tính năng: dò tia, mesh shader, MetalFX.
import Metal
// Đang lấy thiết bị GPU
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal không được hỗ trợ")
}
// Đang kiểm tra khả năng
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // "Apple M4 Pro"
let maxBufferSize = device.maxBufferLength
Thuộc tính maxBufferLength xác định kích thước bộ đệm tối đa mà thiết bị hỗ trợ. Trên Apple Silicon với Unified Memory, giới hạn lên đến 128 GB (trên M4 Ultra). Điều này cho phép làm việc với tập dữ liệu lớn cho ML và tính toán khoa học mà không cần phân đoạn bộ đệm. Thiết bị cũng quản lý nhóm bộ nhớ thông qua MTLHeap.
MTLBuffer — vùng bộ nhớ liền kề có thể truy cập bởi GPU. Bộ đệm được sử dụng cho dữ liệu đỉnh, ma trận, biến uniform. Chế độ: shared (truy cập CPU + GPU trên bộ nhớ hợp nhất), private (chỉ GPU, nhanh hơn), managed (cho GPU rời, có đồng bộ hóa). Trên Apple Silicon, chế độ shared được khuyến nghị vì đơn giản.
MTLTexture — mảng pixel đa chiều cho kết cấu và mục tiêu kết xuất. Hỗ trợ kết cấu 1D, 2D, 3D, cube và array. Định dạng: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (nén), độ sâu (depth32Float) và stencil. Cờ Texture Usage cho biết kết cấu sẽ được sử dụng như thế nào: kết xuất, đọc shader, sao chép.
MTLLibrary — tập hợp các hàm GPU đã biên dịch (shader). Thư viện có thể được tạo từ mã nguồn MSL (Metal Shading Language) trong thời gian chạy hoặc biên dịch trước và đưa vào bundle (.metallib). Biên dịch trước được khuyến nghị để loại bỏ độ trễ khởi tạo.
MTLFunction đại diện cho một hàm shader cụ thể. Vertex shader, fragment shader, compute kernel và mesh shader được tạo thông qua thư viện. Các hàm được lưu vào bộ nhớ đệm trên GPU và tái sử dụng giữa các khung hình. Đối số shader được truyền qua bộ đệm và khe kết cấu với ràng buộc theo chỉ mục.
Kết xuất trong Metal được tổ chức thông qua hàng đợi lệnh bất đồng bộ. Nhà phát triển tạo MTLCommandBuffer, mã hóa lệnh kết xuất hoặc tính toán vào đó và gửi đến MTLCommandQueue. GPU thực thi lệnh tuần tự trong khi CPU có thể tiếp tục làm việc. Đồng bộ hóa diễn ra thông qua semaphore hoặc completionHandler.
MTLCommandQueue — hàng đợi lệnh được tạo từ MTLDevice. Ứng dụng có thể có nhiều hàng đợi cho đồ họa, tính toán và sao chép. Mỗi hàng đợi đảm bảo thực thi lệnh tuần tự. MTLCommandBuffer — vùng chứa cho một lô công việc GPU. Sau khi mã hóa, nó được cam kết và thực thi trên GPU.
// Vòng lặp kết xuất chính
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()
Phương thức drawPrimitives thực thi kết xuất hình học. Tham số vertexCount chỉ định số lượng đỉnh. Bộ đệm lệnh mới được tạo cho mỗi khung hình. Present đồng bộ hóa kết xuất với VSync của màn hình. Metal tự động quản lý đồng bộ hóa màn hình thông qua CAMetalLayer.
MTLRenderPipelineState — trạng thái pipeline kết xuất đã biên dịch, bao gồm vertex và fragment shader, cấu hình depth-stencil, blending và định dạng pixel đầu ra. Tạo pipeline state là một thao tác tốn kém, vì vậy các đối tượng được lưu vào bộ nhớ đệm và tái sử dụng. Các pipeline state khác nhau được tạo cho các tổ hợp shader khác nhau.
Metal 3.1 giới thiệu kết xuất nhanh qua Immutable Samplers được lưu vào bộ nhớ đệm trên GPU để tăng tốc lấy mẫu kết cấu. Metal hỗ trợ tới 31 kết cấu mỗi khe shader trên Apple Silicon. Trên thiết bị cũ với A13 trở xuống, giới hạn giảm xuống 16 khe. Nên kết hợp kết cấu thành Texture Atlas để giảm số lượng mẫu.
Metal Shading Language (MSL) là ngôn ngữ lập trình shader dựa trên C++14 với các phần mở rộng cho tính toán GPU. MSL hỗ trợ template, nạp chồng hàm, không gian tên và số học địa chỉ. Shader được biên dịch thành mã GPU nhị phân thông qua backend LLVM của Apple.
Vertex shader xử lý mỗi đỉnh: biến đổi tọa độ từ không gian thế giới sang không gian màn hình, tính toán pháp tuyến và truyền dữ liệu cho fragment shader. Fragment shader tính toán màu của mỗi pixel: áp dụng kết cấu, ánh sáng và hiệu ứng hậu kỳ.
// Vertex shader 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;
}
Thuộc tính [[attribute(N)]] tương ứng với định dạng đỉnh được chỉ định trong MTLVertexDescriptor. Bộ đệm [buffer(0)] truyền ma trận MVP như một biến uniform. Vị trí đỉnh phải được đánh dấu bằng [[position]] để truyền cho bộ raster. Tất cả các kiểu vector MSL — float2, float3, float4 — được ánh xạ tới thanh ghi phần cứng GPU.
Compute shader (kernel) là hàm GPU được thực thi bên ngoài pipeline đồ họa. Hàm kernel được đánh dấu bằng bộ định tính kernel và thực thi trong các luồng được tổ chức thành threadgroup. Compute shader được sử dụng cho xử lý hình ảnh, mô phỏng vật lý, ML và hậu kỳ.
// Kernel tính toán cho làm mờ hình ảnh
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);
}
Tham số gid [[thread_position_in_grid]] chứa chỉ số luồng duy nhất. Texture2D<type> được chuyên biệt hóa theo kiểu pixel: half (FP16), float (FP32). Compute kernel có thể được khởi chạy với kích thước lưới hơn 1 tỷ luồng trên M4 Ultra. Kích thước threadgroup tối đa là 1024 luồng trên GPU Apple Silicon.
Metal Performance Shaders (MPS) là thư viện các hàm GPU tối ưu do Apple cung cấp. MPS bao gồm mạng nơ-ron tích chập (MPSNNConvolution), nhân ma trận (MPSMatrixMultiplication), sắp xếp (MPSParallelSort) và xử lý hình ảnh (MPSImageGaussianBlur). Tất cả hàm đều được tối ưu cho các GPU Apple cụ thể.
MetalFX là công nghệ nâng cao độ phân giải và khử răng cưa, cạnh tranh với NVIDIA DLSS và AMD FSR. MetalFX cung cấp hai chế độ: Spatial (nâng cao độ phân giải không gian qua thuật toán FSR 2) và Temporal (nâng cao độ phân giải thời gian với vector chuyển động). MetalFX Temporal mang lại chất lượng gần 4K gốc từ kết xuất 1440p.
Theo Apple (2025), MetalFX Temporal trên M4 Max mang lại cải thiện hiệu suất lên đến 3x trong game trong khi duy trì chất lượng không thể phân biệt với độ phân giải gốc. MetalFX hoạt động trên mọi GPU hỗ trợ Metal 3, không cần lõi tensor chuyên dụng. Tích hợp MetalFX vào dự án cần khoảng 50 dòng mã.
Ray Tracing trong Metal 3 được hỗ trợ trên chip M3, M4 và A17 Pro với các đơn vị tăng tốc phần cứng (Ray Tracing Accelerators). Metal cung cấp MTLAccelerationStructure để xây dựng BVH và MTLIntersectionFunction để giao cắt tia trong shader. Cảnh khổng lồ với hàng triệu tam giác được biên dịch thành BVH trong mili giây.
Theo Apple (2025), dò tia phần cứng trên M4 Ultra thực hiện tới 40 tỷ giao cắt tia mỗi giây (Giga rays/s). Nhanh gấp 4 lần so với dò tia phần mềm trên M1 Ultra. Metal RT hỗ trợ truy vấn giao cắt, hình học động và Motion Blur cho hoạt ảnh chân thực. Phản chiếu và bóng đổ với dò tia hoạt động thời gian thực ở 60 FPS.
Unified Memory là kiến trúc Apple Silicon nơi CPU và GPU chia sẻ cùng một bộ nhớ vật lý. Metal trên Apple Silicon không yêu cầu sao chép dữ liệu giữa CPU và GPU: MTLBuffer ở chế độ shared có thể truy cập được bởi cả hai bộ xử lý mà không cần sao chép. Điều này loại bỏ nút thắt cổ chai chính của GPU truyền thống (truyền PCIe).
Zero-Copy trong Metal cho phép CPU ghi dữ liệu vào bộ đệm và GPU đọc dữ liệu đó mà không bị chậm trễ. Theo Apple (2025), điều này mang lại cải thiện hiệu suất 30–50% so với GPU rời trong game và tác vụ ML. Đối với GPU rời (Mac Pro với Radeon), Metal hỗ trợ chế độ managed với đồng bộ hóa tự động qua memory barrier.
Câu hỏi thường gặp
Metal là API GPU cấp thấp của Apple cung cấp chi phí CPU tối thiểu. Nó được sử dụng cho đồ họa 3D, tính toán ML, xử lý hình ảnh và mô phỏng trên iOS, macOS và tvOS. Nó thay thế OpenGL và OpenCL.
Metal chỉ hoạt động trên thiết bị Apple, tích hợp với Unified Memory và Metal Performance Shaders. Vulkan là API đa nền tảng cho Windows, Android và Linux. Cả hai API đều tương đương về hiệu suất, nhưng Metal có chi phí thấp hơn trên Apple Silicon.
Có, với Metal 3 trên chip M3, M4 và A17 Pro có sẵn dò tia phần cứng. Metal cung cấp MTLAccelerationStructure và hỗ trợ truy vấn giao cắt trong shader. Hiệu suất — lên tới 40 Giga rays/s trên M4 Ultra.
MetalFX là công nghệ nâng cao độ phân giải của Apple với chế độ Spatial và Temporal. Nó hoạt động trên mọi GPU có Metal 3, không cần lõi tensor. Mang lại cải thiện hiệu suất lên đến 3x với chất lượng gần 4K gốc trên M4 Max.
Rào cản gia nhập cao hơn SceneKit hoặc Unity do quản lý tài nguyên cấp thấp. Apple cung cấp Metal Sample Code và hướng dẫn tại developer.apple.com. Kết xuất tam giác cơ bản cần khoảng 200 dòng mã.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm