Metal — τι είναι, γραφικό API και shader

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-05-03 Χρόνος ανάγνωσης: 10 λεπ

Το Metal είναι ένα γραφικό και υπολογιστικό API χαμηλού επιπέδου από την Apple, που παρέχει άμεση πρόσβαση στο GPU σε iOS, macOS και tvOS. Αντικαθιστά τα OpenGL και OpenCL, προσφέροντας ελάχιστο φορτίο CPU και προβλέψιμη απόδοση. Σύμφωνα με τα δεδομένα της Apple WWDC (2025), το Metal χρησιμοποιείται στο 98% των εφαρμογών με απόδοση GPU στο οικοσύστημα της Apple.

Βασικά σημεία

  • Metal — χαμηλού επιπέδου GPU API της Apple με υποστήριξη γραφικών και υπολογισμών
  • MTLDevice — αφαίρεση του GPU μέσω της οποίας δημιουργούνται όλοι οι πόροι του Metal
  • Προβολέα εντολών MTLCommandBuffer παρέχουν πολυνηματική εγγραφή εντολών
  • Shader της Metal Shading Language μεταγλωττίζονται σε κώδικα GPU βάση C++14
  • Metal Performance Shaders παρέχουν βελτιστοποιημένες λειτουργίες GPU για ML και φιλτράρισμα

Τι είναι το Metal;

Metal είναι ένα API χαμηλού επιπέδου για εργασία με τον επεξεργαστή γραφικών (GPU), που παρουσιάστηκε από την Apple το 2014 μαζί με τα iOS 8 και OS X Yosemite. Το Metal δημιουργήθηκε ως αντικατάσταση των OpenGL και OpenCL με στόχο τη μείωση του φορτίου CPU και την παροχή πιο άμεσης πρόσβασης στο υλικό GPU σε συσκευές Apple.

Σε αντίθεση με το OpenGL, όπου το πρόγραμμα οδήγησης εκτελεί πολλαπλούς ελέγχους και μετασχηματισμούς στο CPU, το Metal χρησιμοποιεί μοντέλο ρητής διαχείρισης πόρων. Ο προγραμματιστής ελέγχει την κατανομή μνήμης, τον συγχρονισμό και την αποστολή εντολών GPU, που δίνει αύξηση απόδοσης έως 50% σε σύγκριση με το OpenGL ES στο ίδιο υλικό.

Το Metal υποστηρίζει όλα τα τσιπ Apple, από A7 (2013) έως M4 Ultra (2025). Το API εξελίσσεται συνεχώς: Το Metal 3 (2022) πρόσθεσε υποστήριξη για mesh-shader και ιχνηλάσιες ακτίνων, Metal 3.1 (2023) — γρήγορη κοινή χρήση πόρων μεταξύ CPU και GPU, και Metal 4 (2025) — επιτάχυνση υλικού νευρωνικών δικτύων σε GPU με υποστήριξη FP8 και INT4.

Ιστορία του Metal

Η πρώτη έκδοση του Metal (2014) παρείχε βασικό API για γραφική απόδοση σε iOS. Το Metal 2 (2017) πρόσθεσε υπολογιστικούς shader και Metal Performance Shaders. Το Metal 3 (2022) εισήγαγε το MetalFX Upscaling — ιδιόκτητη τεχνολογία upscaling για παιχνίδια, ανταγωνιστής των NVIDIA DLSS και AMD FSR. Το MetalFX παρέχει αύξηση απόδοσης έως 2x σε Mac με M2.

Το Metal 4 (2025) επικεντρώθηκε στη μηχανική μάθηση και την ιχνηλάσιες ακτίνων. Σύμφωνα με τα δεδομένα της Apple (2025), το Metal 4 σε M4 Ultra φτάνει έως 80 TFLOPS σε υπολογιστικές εργασίες σε FP16 και υποστηρίζει αποκωδικοποίηση υλικού AV1. Το Metal υποστηρίζεται πλέον και σε Apple Vision Pro μέσω υπηρεσίας compositor για απόδοση καθηλωτικού περιεχομένου.

Αρχιτεκτονική του Metal: συσκευή και πόροι

Η αρχιτεκτονική του Metal είναι χτισμένη γύρω από την έννοια της ρητής διαχείρισης: ο προγραμματιστής δημιουργεί αντικείμενα MTLDevice (συσκευή), MTLBuffer (προβολέα δεδομένων), MTLTexture (υφή) και MTLCommandQueue (ουρά εντολών). Σε αντίθεση με το OpenGL, όπου η κατάσταση αποθηκεύεται σε περιεχόμενο, το Metal χρησιμοποιεί αντικείμενα κατάστασης (state objects) που μεταγλωττίζονται εκ των προτέρων.

MTLDevice — σημείο εισόδου API

MTLDevice αντιπροσωπεύει ένα φυσικό ή εικονικό GPU. Όλοι οι πόροι του Metal δημιουργούνται μέσω αυτού του αντικειμένου: προβολέα, υφάσματα, βιβλιοθήκες shader, pipeline. Σε συστήματα με πολλαπλές GPU (Mac Pro) μπορεί να επιλεγεί συγκεκριμένη συσκευή. Η μέθοδος supportsFamily: ελέγχει την υποστήριξη λειτουργιών: ιχνηλάσιες ακτίνων, mesh-shader, MetalFX.

swift
import Metal
 
// Λήψη συσκευής GPU
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Το Metal δεν υποστηρίζεται")
}
 
// Έλεγχος δυνατοτήτων
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // “Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

Η ιδιότητα maxBufferLength καθορίζει το μέγιστο μέγεθος προβολέα που υποστηρίζει η συσκευή. Σε Apple Silicon με Unified Memory, το όριο είναι έως 128 GB (σε M4 Ultra). Αυτό επιτρέπει την εργασία με μεγάλα σύνολα δεδομένων για ML και επιστημονικούς υπολογισμούς χωρίς τμηματοποίηση προβολέων. Η συσκευή διαχειρίζεται επίσης την ομάδα μνήμης μέσω MTLHeap.

MTLBuffer και MTLTexture — δεδομένα για GPU

MTLBuffer — συνεχής περιοχή μνήμης προσβάσιμη στο GPU. Οι προβολέα χρησιμοποιούνται για δεδομένα κορυφών, πίνακες, μεταβλητές uniform. Λειτουργίες: shared (πρόσβαση CPU + GPU σε ενοποιημένη μνήμη), private (μόνο GPU, ταχύτερο), managed (για διακριτές GPU, με συγχρονισμό). Σε Apple Silicon, το shared συνιστάται για απλότητα.

MTLTexture — πολυδιάστατος πίνακας εικονοστοιχείων για υφάσματα και στόχους απόδοσης. Υποστηρίζονται υφάσματα 1D, 2D, 3D, cube και array. Μορφές: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (συμπίεση), βάθους (depth32Float) και στένσιλ. Οι σημαίες Texture Usage υποδεικνύουν πώς θα χρησιμοποιηθεί το ύφασμα: απόδοση, ανάγνωση shader, αντιγραφή.

MTLLibrary και μεταγλώττιση shader

MTLLibrary — συλλογή μεταγλωττισμένων λειτουργιών GPU (shader). Η βιβλιοθήκη μπορεί να δημιουργηθεί από πηγαίο κώδικα MSL (Metal Shading Language) κατά το χρόνο εκτέλεσης ή προμεταγλωττισμένη και να συμπεριληφθεί στο πακέτο (.metallib). Η προμεταγλώττιση συνιστάται για την εξάλειψη καθυστερήσεων στη φάση αρχικοποίησης.

MTLFunction αντιπροσωπεύει μια συγκεκριμένη λειτουργία shader. Οι shader κορυφής (vertex), τμήματος (fragment), υπολογισμού (kernel) και mesh-shader δημιουργούνται μέσω της βιβλιοθήκης. Οι λειτουργίες αποθηκεύονται σε cache στο GPU και επαναχρησιμοποιούνται μεταξύ καρέ. Τα ορίσματα shader καθορίζονται μέσω προβολέων και υποδοχών υφάσματος με σύνδεση βάσει δείκτη.

Απόδοση μέσω Metal: προβολέα εντολών

Η απόδοση σε Metal οργανώνεται μέσω ασύγχρονων ουρών εντολών. Ο προγραμματιστής δημιουργεί MTLCommandBuffer, κωδικοποιεί εντολές απόδοσης ή υπολογισμού σε αυτό και το στέλνει στο MTLCommandQueue. Το GPU εκτελεί τις εντολές σειριακά, ενώ το CPU μπορεί να συνεχίσει την εργασία του. Ο συγχρονισμός γίνεται μέσω σημαφόρων ή completionHandler.

MTLCommandQueue και MTLCommandBuffer

MTLCommandQueue — ουρά εντολών που δημιουργείται από MTLDevice. Η εφαρμογή μπορεί να έχει πολλαπλές ουρές για γραφικά, υπολογισμούς και αντιγραφή. Κάθε ουρά εγγυάται σειριακή εκτέλεση εντολών. MTLCommandBuffer — δοχείο για μια μερίδα εργασίας GPU. Μετά την κωδικοποίηση, υποβάλλεται και εκτελείται στο GPU.

swift
// Κύριος βρόχος απόδοσης
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()

Η μέθοδος drawPrimitives εκτελεί τη σχεδίαση γεωμετρίας. Η παράμετρος vertexCount υποδεικνύει τον αριθμό κορυφών. Για κάθε καρέ δημιουργείται νέο command buffer. Present συγχρονίζει τη σχεδίαση με το VSync της οθόνης. Το Metal διαχειρίζεται αυτόματα τον συγχρονισμό με την οθόνη μέσω CAMetalLayer.

Κατάσταση Pipeline Απόδοσης

MTLRenderPipelineState — μεταγλωττισμένη κατάσταση του pipeline απόδοσης, συμπεριλαμβανομένων των shader κορυφής και τμήματος, διαμόρφωσης depth-stencil, blending και μορφής εξόδου εικονοστοιχείων. Η δημιουργία pipeline state είναι δαπανηρή λειτουργία, επομένως τα αντικείμενα αποθηκεύονται σε cache και επαναχρησιμοποιούνται. Για διαφορετικούς συνδυασμούς shader δημιουργούνται διαφορετικά pipeline states.

Το Metal 3.1 εισήγαγε γρήγορη απόδοση μέσω Immutable Samplers, που αποθηκεύονται σε cache στο GPU για επιτάχυνση δειγματοληψίας υφάσματος. Το Metal υποστηρίζει έως 31 υφάσματα ανά υποδοχή shader σε περιβάλλοντα Apple Silicon. Σε παλαιότερες συσκευές με A13 και κάτω, το όριο μειώνεται σε 16 υποδοχές. Συνιστάται ο συνδυασμός υφασμάτων σε Texture Atlases για μείωση του αριθμού δειγμάτων.

Metal Shading Language και shader

Metal Shading Language (MSL) — γλώσσα προγραμματισμού shader βασισμένη σε C++14 με επεκτάσεις για υπολογισμούς GPU. Το MSL υποστηρίζει πρότυπα (templates), υπερφόρτωση συναρτήσεων, χώρους ονομάτων και αριθμητική διευθύνσεων. Οι shader μεταγλωττίζονται σε δυαδικό κώδικα GPU μέσω του backend LLVM της Apple.

Shader Κορυφής και Τμήματος

Vertex shader επεξεργάζεται κάθε κορυφή: μετασχηματίζει συντεταγμένες από τον χώρο κόσμου στον χώρο οθόνης, υπολογίζει κανονικές και μεταβιβάζει δεδομένα στον fragment shader. Fragment shader υπολογίζει το χρώμα κάθε εικονοστοιχείου: εφαρμόζει υφάσματα, φωτισμό και εφέ μετα-επεξεργασίας.

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;
}

Τα χαρακτηριστικά [[attribute(N)]] αντιστοιχούν σε μορφές κορυφής που καθορίζονται στο MTLVertexDescriptor. Ο προβολέας [buffer(0)] μεταφέρει τον πίνακα MVP ως μεταβλητή uniform. Η θέση κορυφής πρέπει να σημανθεί με [[position]] για μεταβίβαση στον ραστεροποιητή. Όλοι οι τύποι διανυσμάτων MSL — float2, float3, float4 — αντιστοιχίζονται σε καταχωρητές υλικού GPU.

Shader Υπολογισμού (Compute Kernels)

Compute shader (kernel) — συνάρτηση GPU που εκτελείται εκτός του γραφικού pipeline. Οι συναρτήσεις kernel σημειώνονται με τον προσδιοριστή kernel και εκτελούνται σε νήματα (threads) οργανωμένα σε ομάδες (threadgroups). Οι shader υπολογισμού χρησιμοποιούνται για επεξεργασία εικόνας, προσομοίωση φυσικής, ML και μετα-επεξεργασία.

cpp
// Compute kernel για θόλωση εικόνας
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);
}

Η παράμετρος gid [[thread_position_in_grid]] περιέχει μοναδικό δείκτη νήματος. Το Texture2D εξειδικεύεται ανάλογα με τον τύπο εικονοστοιχείου: half (FP16), float (FP32). Τα compute kernels μπορούν να εκκινηθούν με μέγεθος πλέγματος άνω του 1 δισεκατομμυρίου νημάτων σε M4 Ultra. Το μέγιστο μέγεθος threadgroup είναι 1024 νήματα σε GPU Apple Silicon.

Απόδοση και Metal Performance Shaders

Metal Performance Shaders (MPS) — βιβλιοθήκη βελτιστοποιημένων λειτουργιών GPU από την Apple. Το MPS περιλαμβάνει συνελικτικά νευρωνικά δίκτυα (MPSNNConvolution), πολλαπλασιασμούς πινάκων (MPSMatrixMultiplication), ταξινόμηση (MPSParallelSort) και επεξεργασία εικόνας (MPSImageGaussianBlur). Όλες οι λειτουργίες είναι βελτιστοποιημένες για συγκεκριμένες GPU Apple.

MetalFX Upscaling

MetalFX — τεχνολογία upscaling και εξομάλυνσης, ανταγωνιστής των NVIDIA DLSS και AMD FSR. Το MetalFX προσφέρει δύο λειτουργίες: Spatial (χωρικό upscaling μέσω αλγορίθμου FSR 2) και Temporal (χρονικό upscaling με διανύσματα κίνησης). Το Temporal MetalFX παρέχει ποιότητα κοντά στο native 4K από απόδοση σε 1440p.

Σύμφωνα με τα δεδομένα της Apple (2025), το MetalFX Temporal σε M4 Max παρέχει αύξηση απόδοσης έως 3x σε παιχνίδια διατηρώντας ποιότητα οπτικά διακεκριμένη από native ανάλυση. Το MetalFX λειτουργεί σε οποιοδήποτε GPU υποστηρίζει Metal 3, χωρίς αφιερωμένους πυρήνες tensor. Η ενσωμάτωση του MetalFX σε ένα έργο απαιτεί περίπου 50 γραμμές κώδικα.

Ιχνηλάσιες Ακτίνων σε Metal

Ray Tracing στο Metal 3 υποστηρίζεται σε τσιπ M3, M4 και A17 Pro με μπλοκ επιτάχυνσης υλικού (Ray Tracing Accelerators). Το Metal παρέχει MTLAccelerationStructure για κατασκευή BVH και MTLIntersectionFunction για τομή ακτίνων σε shader. Γιγαντιαίες σκηνές με εκατομμύρια τρίγωνα μεταγλωττίζονται σε BVH σε χιλιοστά του δευτερολέπτου.

Σύμφωνα με τα δεδομένα της Apple (2025), η ιχνηλάσιες ακτίνων υλικού σε M4 Ultra εκτελεί έως 40 δισεκατομμύρια τομές ακτίνων ανά δευτερόλεπτο (Giga rays/s). Αυτό είναι 4 φορές ταχύτερο από την ιχνηλάσιες ακτίνων λογισμικού σε M1 Ultra. Το Metal RT υποστηρίζει intersection queries, δυναμικές γεωμετρίες και Motion Blur για ρεαλιστικά κινούμενα σχέδια. Οι αντανακλάσεις και οι σκιές με ιχνηλάσιες ακτίνων λειτουργούν σε πραγματικό χρόνο στα 60 FPS.

Unified Memory και Zero-Copy

Unified Memory — η αρχιτεκτονική Apple Silicon όπου το CPU και το GPU χρησιμοποιούν την ίδια φυσική μνήμη. Το Metal σε Apple Silicon δεν απαιτεί αντιγραφή δεδομένων μεταξύ CPU και GPU: το MTLBuffer σε shared λειτουργία είναι προσβάσιμο και στους δύο επεξεργαστές χωρίς αντιγραφή. Αυτό εξαλείφει το κύριο σημείο συμφόρησης των παραδοσιακών GPU (μεταφορές PCIe).

Το Zero-Copy σε Metal επιτρέπει στο CPU να γράφει δεδομένα στον προβολέα και στο GPU να τα διαβάζει χωρίς καθυστέρηση. Σύμφωνα με τα δεδομένα της Apple (2025), αυτό παρέχει αύξηση απόδοσης 30–50% σε σύγκριση με διακριτές GPU σε παιχνίδια και εργασίες ML. Για διακριτές GPU (Mac Pro με Radeon), το Metal υποστηρίζει λειτουργία managed με αυτόματο συγχρονισμό μέσω memory barriers.

Συχνές Ερωτήσεις

Τι είναι το Metal και σε τι χρησιμεύει;

Metal — το χαμηλού επιπέδου API της Apple για εργασία με GPU, που παρέχει ελάχιστο φορτίο CPU. Χρησιμοποιείται για 3D γραφικά, υπολογισμούς ML, επεξεργασία εικόνας και προσομοιώσεις σε iOS, macOS και tvOS. Αντικαθιστά τα OpenGL και OpenCL.

Σε τι διαφέρει το Metal από το Vulkan;

Metal λειτουργεί μόνο σε συσκευές Apple, είναι ενσωματωμένο με Unified Memory και Metal Performance Shaders. Το Vulkan είναι ένα διαπλατφορμικό API για Windows, Android και Linux. Από πλευράς απόδοσης, και τα δύο API είναι συγκρίσιμα, αλλά το Metal έχει μικρότερο overhead σε Apple Silicon.

Υποστηρίζει το Metal ιχνηλάσιες ακτίνων;

Ναι, από το Metal 3 σε τσιπ M3, M4 και A17 Pro είναι διαθέσιμη η ιχνηλάσιες ακτίνων υλικού. Το Metal παρέχει MTLAccelerationStructure και υποστήριξη intersection queries σε shader. Απόδοση — έως 40 Giga rays/s σε M4 Ultra.

Τι είναι το MetalFX Upscaling;

MetalFX — τεχνολογία upscaling της Apple με λειτουργίες Spatial και Temporal. Λειτουργεί σε οποιοδήποτε GPU με Metal 3, χωρίς πυρήνες tensor. Παρέχει αύξηση απόδοσης έως 3x με ποιότητα κοντά στο native 4K σε M4 Max.

Είναι δύσκολο να ξεκινήσει κανείς με το Metal;

Το κατώφλι εισόδου είναι υψηλότερο από το SceneKit ή το Unity λόγω της διαχείρισης πόρων χαμηλού επιπέδου. Η Apple παρέχει Metal Sample Code και φροντιστήρια στο developer.apple.com. Για βασική απόδοση ενός τριγώνου απαιτούνται περίπου 200 γραμμές κώδικα.

Σύνοψη

  • Metal — χαμηλού επιπέδου GPU API της Apple με ελάχιστο φορτίο CPU
  • MTLDevice και MTLCommandQueue — βάση της αρχιτεκτονικής με ρητή διαχείριση πόρων
  • MTLCommandBuffer και κωδικοποιητές παρέχουν πολυνηματική εγγραφή εντολών GPU
  • Metal Shading Language (C++14) υποστηρίζει shader vertex, fragment, compute και mesh
  • MetalFX — upscaling με αύξηση έως 3x σε οποιοδήποτε GPU με Metal 3
  • Ιχνηλάσιες ακτίνων υλικού διαθέσιμη σε M3/M4/A17 Pro
  • Unified Memory σε Apple Silicon εξαλείφει την αντιγραφή δεδομένων μεταξύ CPU και GPU

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης