Metal — nó là gì, API đồ họa và shader

Tác giả: IT Sectr Đã đăng: 2026-05-03 Thời gian đọc: 10 phút

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 — API GPU cấp thấp của Apple hỗ trợ đồ họa và tính toán
  • MTLDevice — trừu tượng hóa GPU qua đó tất cả tài nguyên Metal được tạo
  • Bộ đệm lệnh MTLCommandBuffer cho phép ghi lệnh đa luồng
  • Shader Metal Shading Language biên dịch thành mã GPU dựa trên C++14
  • Metal Performance Shaders cung cấp hàm GPU tối ưu cho ML và lọc

Metal là gì?

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.

Lịch sử Metal

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: Thiết bị và Tài nguyên

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ểm vào API

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.

swift
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à MTLTexture — Dữ liệu cho GPU

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 và Biên dịch Shader

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 qua Metal: Bộ đệm lệnh

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 và MTLCommandBuffer

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.

swift
// 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.

Trạng thái Pipeline kết xuất

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 và Shader

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 và Fragment Shader

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ỳ.

cpp
// 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 Kernel

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ỳ.

cpp
// 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.

Hiệu suất và Metal Performance Shaders

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 Upscaling

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ã.

Dò tia trong Metal

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.

Bộ nhớ hợp nhất và Zero-Copy

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à gì và tại sao cần nó?

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 khác Vulkan như thế nào?

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.

Metal có hỗ trợ dò tia không?

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 Upscaling là gì?

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.

Có khó để bắt đầu làm việc với Metal không?

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

  • Metal — API GPU cấp thấp của Apple với chi phí CPU tối thiểu
  • MTLDeviceMTLCommandQueue — nền tảng kiến trúc với quản lý tài nguyên rõ ràng
  • MTLCommandBuffer và bộ mã hóa cho phép ghi lệnh GPU đa luồng
  • Metal Shading Language (C++14) hỗ trợ vertex, fragment, compute và mesh shader
  • MetalFX — nâng cao độ phân giải với cải thiện lên đến 3x trên mọi GPU có Metal 3
  • Dò tia phần cứng có sẵn trên M3/M4/A17 Pro
  • Bộ nhớ hợp nhất trên Apple Silicon loại bỏ sao chép dữ liệu giữa CPU và GPU

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.

Thảo luận dự án

Đọc thêm