Metal — คืออะไร, API กราฟิกและเชเดอร์

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-05-03 เวลาอ่าน: 10 นาที

Metal คือ API กราฟิกและคำนวณระดับต่ำจาก Apple ที่ให้การเข้าถึง GPU โดยตรงบน iOS, macOS และ tvOS โดยแทนที่ OpenGL และ OpenCL มอบโอเวอร์เฮด CPU ที่น้อยที่สุดและประสิทธิภาพที่คาดเดาได้ ตามข้อมูล Apple WWDC (2025) Metal ถูกใช้ใน 98% ของแอปพลิเคชันที่มีการเรนเดอร์ GPU ในระบบนิเวศของ Apple

ประเด็นสำคัญ

  • Metal — API GPU ระดับต่ำของ Apple รองรับกราฟิกและการคำนวณ
  • MTLDevice — สิ่งที่เป็นนามธรรมของ GPU ที่ใช้สร้างทรัพยากร Metal ทั้งหมด
  • บัฟเฟอร์คำสั่ง MTLCommandBuffer ช่วยให้บันทึกคำสั่งแบบหลายเธรด
  • เชเดอร์ 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 เชเดอร์และการเรย์เทรซิ่ง Metal 3.1 (2023) — การแชร์ทรัพยากรอย่างรวดเร็วระหว่าง CPU และ GPU และ Metal 4 (2025) — การเร่งความเร็วฮาร์ดแวร์โครงข่ายประสาทเทียม บน GPU พร้อมรองรับ FP8 และ INT4

ประวัติของ Metal

Metal เวอร์ชันแรก (2014) มอบ API พื้นฐานสำหรับการเรนเดอร์กราฟิกบน iOS Metal 2 (2017) เพิ่ม compute เชเดอร์และ Metal Performance Shaders Metal 3 (2022) นำเสนอ MetalFX Upscaling — การยกระดับความละเอียดของ Apple สำหรับเกม คู่แข่งกับ 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 ใช้ออบเจ็กต์สถานะที่ถูกคอมไพล์ล่วงหน้า

MTLDevice — จุดเข้า API

MTLDevice แทน GPU ทางกายภาพหรือเสมือน ทรัพยากร Metal ทั้งหมดถูกสร้างผ่านออบเจ็กต์นี้: บัฟเฟอร์ พื้นผิว ไลบรารีเชเดอร์ ไพพลายน์ ในระบบที่มี GPU หลายตัว (Mac Pro) สามารถเลือกอุปกรณ์เฉพาะได้ เมธอด supportsFamily: ตรวจสอบการรองรับฟีเจอร์: การเรย์เทรซิ่ง mesh เชเดอร์ 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 บ่งชี้ว่าพื้นผิวจะถูกใช้อย่างไร: การเรนเดอร์ การอ่านเชเดอร์ การคัดลอก

MTLLibrary และการคอมไพล์เชเดอร์

MTLLibrary — ชุดรวมฟังก์ชัน GPU ที่คอมไพล์แล้ว (เชเดอร์) ไลบรารีสามารถสร้างจากโค้ดต้นฉบับ MSL (Metal Shading Language) ในขณะรันไทม์ หรือคอมไพล์ล่วงหน้าและรวมในบันเดิล (.metallib) แนะนำให้คอมไพล์ล่วงหน้าเพื่อกำจัดความล่าช้าในการเริ่มต้น

MTLFunction แทนฟังก์ชันเชเดอร์เฉพาะ เวอร์เท็กซ์เชเดอร์ แฟรกเมนต์เชเดอร์ คอมพิวต์เคอร์เนล และเมชเชเดอร์ถูกสร้างผ่านไลบรารี ฟังก์ชันถูกแคชบน GPU และนำกลับมาใช้ใหม่ระหว่างเฟรม อาร์กิวเมนต์เชเดอร์ถูกส่งผ่านบัฟเฟอร์และช่องพื้นผิวด้วยการผูกตามดัชนี

การเรนเดอร์ผ่าน 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 ระบุจำนวนจุดยอด บัฟเฟอร์คำสั่งใหม่ถูกสร้างขึ้นสำหรับแต่ละเฟรม Present ซิงโครไนซ์การเรนเดอร์กับ VSync ของจอแสดงผล Metal จัดการการซิงโครไนซ์จอแสดงผลโดยอัตโนมัติผ่าน CAMetalLayer

สถานะไพพลายน์การเรนเดอร์

MTLRenderPipelineState — สถานะไพพลายน์การเรนเดอร์ที่คอมไพล์แล้ว รวมถึงเวอร์เท็กซ์และแฟรกเมนต์เชเดอร์ การกำหนดค่า depth-stencil การผสม และรูปแบบพิกเซลเอาต์พุต การสร้างสถานะไพพลายน์เป็นการดำเนินการที่มีค่าใช้จ่ายสูง ดังนั้นออบเจ็กต์จึงถูกแคชและนำกลับมาใช้ใหม่ สถานะไพพลายน์ที่แตกต่างกันถูกสร้างขึ้นสำหรับชุดเชเดอร์ที่แตกต่างกัน

Metal 3.1 นำเสนอ การเรนเดอร์ที่รวดเร็วผ่าน Immutable Samplers ที่ถูกแคชบน GPU เพื่อเร่งการสุ่มตัวอย่างพื้นผิว Metal รองรับพื้นผิวสูงสุด 31 ชิ้นต่อช่องเชเดอร์บน Apple Silicon บนอุปกรณ์รุ่นเก่าที่มี A13 และต่ำกว่าขีดจำกัดลดลงเหลือ 16 ช่อง แนะนำให้รวมพื้นผิวเป็น Texture Atlas เพื่อลดจำนวนตัวอย่าง

Metal Shading Language และเชเดอร์

Metal Shading Language (MSL) คือภาษาการเขียนโปรแกรมเชเดอร์บนพื้นฐาน C++14 พร้อมส่วนขยายสำหรับการคำนวณ GPU MSL รองรับเทมเพลต การโอเวอร์โหลดฟังก์ชัน เนมสเปซ และเลขคณิตที่อยู่ เชเดอร์ถูกคอมไพล์เป็นโค้ด GPU ไบนารีผ่านแบ็คเอนด์ LLVM ของ Apple

เวอร์เท็กซ์และแฟรกเมนต์เชเดอร์

เวอร์เท็กซ์เชเดอร์ ประมวลผลแต่ละจุดยอด: แปลงพิกัดจากพื้นที่โลกไปยังพื้นที่จอภาพ คำนวณนอร์มัล และส่งข้อมูลไปยังแฟรกเมนต์เชเดอร์ แฟรกเมนต์เชเดอร์ คำนวณสีของแต่ละพิกเซล: ใช้พื้นผิว แสง และเอฟเฟกต์หลังการประมวลผล

cpp
// เวอร์เท็กซ์เชเดอร์ 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

คอมพิวต์เคอร์เนล

คอมพิวต์เชเดอร์ (เคอร์เนล) คือฟังก์ชัน GPU ที่ทำงานนอกไพพลายน์กราฟิก ฟังก์ชันเคอร์เนลถูกทำเครื่องหมายด้วยตัวระบุ kernel และทำงานในเธรดที่จัดกลุ่มเป็น threadgroup คอมพิวต์เชเดอร์ใช้สำหรับการประมวลผลภาพ การจำลองฟิสิกส์ ML และหลังการประมวลผล

cpp
// เคอร์เนลคำนวณสำหรับภาพเบลอ
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<type> ถูกจำเพาะตามชนิดพิกเซล: half (FP16), float (FP32) คอมพิวต์เคอร์เนลสามารถเริ่มทำงานด้วยขนาดกริดมากกว่า 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 การยกระดับความละเอียด

MetalFX คือเทคโนโลยียกระดับความละเอียดและลดรอยหยัก คู่แข่งกับ NVIDIA DLSS และ AMD FSR MetalFX มีสองโหมด: Spatial (การยกระดับความละเอียดเชิงพื้นที่ผ่านอัลกอริทึม FSR 2) และ Temporal (การยกระดับความละเอียดเชิงเวลาด้วย motion vectors) MetalFX Temporal ให้คุณภาพใกล้เคียงกับ 4K ดั้งเดิมจากการเรนเดอร์ที่ 1440p

ตามข้อมูล Apple (2025) MetalFX Temporal บน M4 Max ให้ประสิทธิภาพดีขึ้นถึง 3x ในเกมขณะรักษาคุณภาพที่แยกไม่ออกจากความละเอียดดั้งเดิม MetalFX ทำงานบน GPU ใดก็ได้ที่รองรับ Metal 3 โดยไม่ต้องใช้เทนเซอร์คอร์เฉพาะ การรวม MetalFX เข้าในโปรเจ็กต์ใช้โค้ดประมาณ 50 บรรทัด

การเรย์เทรซิ่งใน Metal

การเรย์เทรซิ่ง ใน Metal 3 รองรับบนชิป M3, M4 และ A17 Pro พร้อมหน่วยเร่งความเร็วฮาร์ดแวร์ (Ray Tracing Accelerators) Metal จัดเตรียม MTLAccelerationStructure สำหรับสร้าง BVH และ MTLIntersectionFunction สำหรับการตัดกันของรังสีในเชเดอร์ ฉากขนาดใหญ่ที่มีรูปสามเหลี่ยมหลายล้านรูปถูกคอมไพล์เป็น BVH ในมิลลิวินาที

ตามข้อมูล Apple (2025) การเรย์เทรซิ่งฮาร์ดแวร์บน M4 Ultra ดำเนินการตัดกันของรังสีสูงถึง 40 พันล้านครั้งต่อวินาที (Giga rays/s) ซึ่งเร็วกว่าการเรย์เทรซิ่งซอฟต์แวร์บน M1 Ultra ถึง 4 เท่า Metal RT รองรับการสอบถามการตัดกัน เรขาคณิตไดนามิก และ Motion Blur สำหรับแอนิเมชันที่สมจริง ภาพสะท้อนและเงาด้วยการเรย์เทรซิ่งทำงานแบบเรียลไทม์ที่ 60 FPS

หน่วยความจำรวมและ 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 barrier

คำถามที่พบบ่อย

Metal คืออะไรและทำไมจึงต้องใช้?

Metal คือ API GPU ระดับต่ำของ Apple ที่ให้โอเวอร์เฮด CPU น้อยที่สุด ใช้สำหรับกราฟิก 3D การคำนวณ ML การประมวลผลภาพและการจำลองบน iOS, macOS และ tvOS แทนที่ OpenGL และ OpenCL

Metal แตกต่างจาก Vulkan อย่างไร?

Metal ทำงานบนอุปกรณ์ Apple เท่านั้น ผสานรวมกับ Unified Memory และ Metal Performance Shaders Vulkan คือ API ข้ามแพลตฟอร์มสำหรับ Windows, Android และ Linux API ทั้งสองมีประสิทธิภาพเทียบเคียงได้ แต่ Metal มีโอเวอร์เฮดต่ำกว่าบน Apple Silicon

Metal รองรับการเรย์เทรซิ่งหรือไม่?

ใช่ ด้วย Metal 3 บนชิป M3, M4 และ A17 Pro การเรย์เทรซิ่งฮาร์ดแวร์สามารถใช้งานได้ Metal จัดเตรียม MTLAccelerationStructure และรองรับการสอบถามการตัดกันในเชเดอร์ ประสิทธิภาพ — สูงถึง 40 Giga rays/s บน M4 Ultra

MetalFX Upscaling คืออะไร?

MetalFX คือเทคโนโลยียกระดับความละเอียดของ Apple ด้วยโหมด Spatial และ Temporal ทำงานบน GPU ใดก็ได้ที่มี Metal 3 โดยไม่ต้องใช้เทนเซอร์คอร์ ให้ประสิทธิภาพดีขึ้นถึง 3x ด้วยคุณภาพใกล้เคียง 4K ดั้งเดิมบน M4 Max

การเริ่มทำงานกับ Metal ยากไหม?

อุปสรรคในการเริ่มต้นสูงกว่า SceneKit หรือ Unity เนื่องจากการจัดการทรัพยากรระดับต่ำ Apple จัดเตรียม Metal Sample Code และบทเรียนบน developer.apple.com การเรนเดอร์สามเหลี่ยมพื้นฐานต้องใช้โค้ดประมาณ 200 บรรทัด

สรุป

  • Metal — API GPU ระดับต่ำของ Apple ที่มีโอเวอร์เฮด CPU น้อยที่สุด
  • MTLDevice และ MTLCommandQueue — พื้นฐานของสถาปัตยกรรมด้วยการจัดการทรัพยากรอย่างชัดแจ้ง
  • MTLCommandBuffer และตัวเข้ารหัสช่วยให้บันทึกคำสั่ง GPU แบบหลายเธรด
  • Metal Shading Language (C++14) รองรับเวอร์เท็กซ์ แฟรกเมนต์ คอมพิวต์ และเมชเชเดอร์
  • MetalFX — การยกระดับความละเอียดที่ดีขึ้นถึง 3x บน GPU ใดก็ได้ที่มี Metal 3
  • การเรย์เทรซิ่งฮาร์ดแวร์ พร้อมใช้งานบน M3/M4/A17 Pro
  • หน่วยความจำรวม บน Apple Silicon กำจัดการคัดลอกข้อมูลระหว่าง CPU และ GPU

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม