Το Metal είναι ένα γραφικό και υπολογιστικό API χαμηλού επιπέδου από την Apple, που παρέχει άμεση πρόσβαση στο GPU σε iOS, macOS και tvOS. Αντικαθιστά τα OpenGL και OpenCL, προσφέροντας ελάχιστο φορτίο CPU και προβλέψιμη απόδοση. Σύμφωνα με τα δεδομένα της Apple WWDC (2025), το Metal χρησιμοποιείται στο 98% των εφαρμογών με απόδοση GPU στο οικοσύστημα της Apple.
Βασικά σημεία
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 (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 είναι χτισμένη γύρω από την έννοια της ρητής διαχείρισης: ο προγραμματιστής δημιουργεί αντικείμενα MTLDevice (συσκευή), MTLBuffer (προβολέα δεδομένων), MTLTexture (υφή) και MTLCommandQueue (ουρά εντολών). Σε αντίθεση με το OpenGL, όπου η κατάσταση αποθηκεύεται σε περιεχόμενο, το Metal χρησιμοποιεί αντικείμενα κατάστασης (state objects) που μεταγλωττίζονται εκ των προτέρων.
MTLDevice αντιπροσωπεύει ένα φυσικό ή εικονικό GPU. Όλοι οι πόροι του Metal δημιουργούνται μέσω αυτού του αντικειμένου: προβολέα, υφάσματα, βιβλιοθήκες shader, pipeline. Σε συστήματα με πολλαπλές GPU (Mac Pro) μπορεί να επιλεγεί συγκεκριμένη συσκευή. Η μέθοδος supportsFamily: ελέγχει την υποστήριξη λειτουργιών: ιχνηλάσιες ακτίνων, mesh-shader, MetalFX.
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 — συνεχής περιοχή μνήμης προσβάσιμη στο 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 — συλλογή μεταγλωττισμένων λειτουργιών GPU (shader). Η βιβλιοθήκη μπορεί να δημιουργηθεί από πηγαίο κώδικα MSL (Metal Shading Language) κατά το χρόνο εκτέλεσης ή προμεταγλωττισμένη και να συμπεριληφθεί στο πακέτο (.metallib). Η προμεταγλώττιση συνιστάται για την εξάλειψη καθυστερήσεων στη φάση αρχικοποίησης.
MTLFunction αντιπροσωπεύει μια συγκεκριμένη λειτουργία shader. Οι shader κορυφής (vertex), τμήματος (fragment), υπολογισμού (kernel) και mesh-shader δημιουργούνται μέσω της βιβλιοθήκης. Οι λειτουργίες αποθηκεύονται σε cache στο GPU και επαναχρησιμοποιούνται μεταξύ καρέ. Τα ορίσματα shader καθορίζονται μέσω προβολέων και υποδοχών υφάσματος με σύνδεση βάσει δείκτη.
Η απόδοση σε Metal οργανώνεται μέσω ασύγχρονων ουρών εντολών. Ο προγραμματιστής δημιουργεί MTLCommandBuffer, κωδικοποιεί εντολές απόδοσης ή υπολογισμού σε αυτό και το στέλνει στο MTLCommandQueue. Το GPU εκτελεί τις εντολές σειριακά, ενώ το CPU μπορεί να συνεχίσει την εργασία του. Ο συγχρονισμός γίνεται μέσω σημαφόρων ή completionHandler.
MTLCommandQueue — ουρά εντολών που δημιουργείται από MTLDevice. Η εφαρμογή μπορεί να έχει πολλαπλές ουρές για γραφικά, υπολογισμούς και αντιγραφή. Κάθε ουρά εγγυάται σειριακή εκτέλεση εντολών. MTLCommandBuffer — δοχείο για μια μερίδα εργασίας GPU. Μετά την κωδικοποίηση, υποβάλλεται και εκτελείται στο GPU.
// Κύριος βρόχος απόδοσης
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.
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 (MSL) — γλώσσα προγραμματισμού shader βασισμένη σε C++14 με επεκτάσεις για υπολογισμούς GPU. Το MSL υποστηρίζει πρότυπα (templates), υπερφόρτωση συναρτήσεων, χώρους ονομάτων και αριθμητική διευθύνσεων. Οι shader μεταγλωττίζονται σε δυαδικό κώδικα GPU μέσω του backend LLVM της Apple.
Vertex shader επεξεργάζεται κάθε κορυφή: μετασχηματίζει συντεταγμένες από τον χώρο κόσμου στον χώρο οθόνης, υπολογίζει κανονικές και μεταβιβάζει δεδομένα στον fragment shader. Fragment shader υπολογίζει το χρώμα κάθε εικονοστοιχείου: εφαρμόζει υφάσματα, φωτισμό και εφέ μετα-επεξεργασίας.
// 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.
Compute shader (kernel) — συνάρτηση GPU που εκτελείται εκτός του γραφικού pipeline. Οι συναρτήσεις kernel σημειώνονται με τον προσδιοριστή kernel και εκτελούνται σε νήματα (threads) οργανωμένα σε ομάδες (threadgroups). Οι shader υπολογισμού χρησιμοποιούνται για επεξεργασία εικόνας, προσομοίωση φυσικής, ML και μετα-επεξεργασία.
// 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
Metal Performance Shaders (MPS) — βιβλιοθήκη βελτιστοποιημένων λειτουργιών GPU από την Apple. Το MPS περιλαμβάνει συνελικτικά νευρωνικά δίκτυα (MPSNNConvolution), πολλαπλασιασμούς πινάκων (MPSMatrixMultiplication), ταξινόμηση (MPSParallelSort) και επεξεργασία εικόνας (MPSImageGaussianBlur). Όλες οι λειτουργίες είναι βελτιστοποιημένες για συγκεκριμένες GPU Apple.
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 γραμμές κώδικα.
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 — η αρχιτεκτονική 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 — το χαμηλού επιπέδου API της Apple για εργασία με GPU, που παρέχει ελάχιστο φορτίο CPU. Χρησιμοποιείται για 3D γραφικά, υπολογισμούς ML, επεξεργασία εικόνας και προσομοιώσεις σε iOS, macOS και tvOS. Αντικαθιστά τα OpenGL και OpenCL.
Metal λειτουργεί μόνο σε συσκευές Apple, είναι ενσωματωμένο με Unified Memory και Metal Performance Shaders. Το Vulkan είναι ένα διαπλατφορμικό API για Windows, Android και Linux. Από πλευράς απόδοσης, και τα δύο API είναι συγκρίσιμα, αλλά το Metal έχει μικρότερο overhead σε Apple Silicon.
Ναι, από το Metal 3 σε τσιπ M3, M4 και A17 Pro είναι διαθέσιμη η ιχνηλάσιες ακτίνων υλικού. Το Metal παρέχει MTLAccelerationStructure και υποστήριξη intersection queries σε shader. Απόδοση — έως 40 Giga rays/s σε M4 Ultra.
MetalFX — τεχνολογία upscaling της Apple με λειτουργίες Spatial και Temporal. Λειτουργεί σε οποιοδήποτε GPU με Metal 3, χωρίς πυρήνες tensor. Παρέχει αύξηση απόδοσης έως 3x με ποιότητα κοντά στο native 4K σε M4 Max.
Το κατώφλι εισόδου είναι υψηλότερο από το SceneKit ή το Unity λόγω της διαχείρισης πόρων χαμηλού επιπέδου. Η Apple παρέχει Metal Sample Code και φροντιστήρια στο developer.apple.com. Για βασική απόδοση ενός τριγώνου απαιτούνται περίπου 200 γραμμές κώδικα.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης