CALayer: khái niệm, kiến thức cốt lõi và kết xuất layer

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

CALayer là lớp cơ sở cho các layer đồ họa trong iOS, một phần của framework QuartzCore. Mỗi UIView trong iOS có một CALayer liên kết xử lý kết xuất nội dung, hoạt ảnh và tổng hợp trên GPU. Theo Apple QuartzCore Documentation, 2025, CALayer hỗ trợ hơn 40 thuộc tính có thể tạo hoạt ảnh và hoạt động trực tiếp thông qua Metal. Hiểu về CALayer là cần thiết để tạo hoạt ảnh mượt mà và tối ưu hiệu suất giao diện.

Điểm chính

  • CALayer là khối xây dựng cơ bản của biểu diễn trực quan trong iOS, quản lý rasterization và tổng hợp.
  • Mỗi UIView chứa một layer có thể truy cập qua thuộc tính layer — nhà phát triển có thể tùy chỉnh giao diện mà không cần tạo lớp con UIView.
  • Core Animation sử dụng CALayer để tạo hoạt ảnh cho các thuộc tính: position, bounds, opacity, transform, backgroundColor.
  • Các lớp con của CALayer — CAShapeLayer, CATextLayer, CAGradientLayer, CAEmitterLayer — giải quyết các tác vụ kết xuất cụ thể.
  • Kết xuất CALayer được thực hiện trên GPU thông qua Metal, đảm bảo 60 FPS với cấu hình layer phù hợp.

CALayer là gì?

CALayer là một lớp từ framework QuartzCore quản lý hình ảnh bitmap của một vùng hình chữ nhật trên màn hình. Nó lưu trữ các thuộc tính trực quan: frame, backgroundColor, opacity, shadow, border, transform. Không giống như UIView, CALayer không xử lý sự kiện chạm, không tham gia Auto Layout và không có vòng đời view controller.

Về mặt kiến trúc, CALayer triển khai mẫu Model trong bối cảnh Core Animation. Layer lưu trữ trạng thái của các thuộc tính trực quan, trong khi Core Animation quản lý việc nội suy giữa các trạng thái trong quá trình tạo hoạt ảnh. Sự tách biệt này cho phép tạo hoạt ảnh cho bất kỳ thuộc tính layer nào mà không cần vẽ lại nội dung thông qua drawRect.

Theo Apple WWDC 2024, CALayer đã được viết lại để hoạt động thông qua Metal. Đường ống kết xuất hiện đại bao gồm ba giai đoạn: Commit (cập nhật thuộc tính trên CPU), Render (tạo lệnh GPU trên CPU) và Composite (thực thi lệnh trên GPU). CALayer tham gia vào cả ba giai đoạn, cung cấp dữ liệu cho mỗi giai đoạn.

Mỗi layer có thể chứa sublayers — các layer con kết xuất trên layer cha. Hệ thống phân cấp layer phản ánh hệ thống phân cấp UIView nhưng có thể tồn tại độc lập với nó. Nhà phát triển có thể tạo layer độc lập với UIView thông qua CALayer() và thêm chúng vào hệ thống phân cấp qua addSublayer.

Sự khác biệt giữa CALayer và UIView

UIView là một wrapper bao quanh CALayer bổ sung: xử lý chạm qua UIResponder, tham gia Auto Layout, biểu diễn trong storyboard và tích hợp với UIViewController. CALayer là một đối tượng nhẹ có thể được sử dụng mà không cần UIView cho các phần tử trực quan thuần túy.

Trong thực tế, điều này có nghĩa là nếu một phần tử không cần xử lý chạm hoặc bố cục, nó có thể được triển khai dưới dạng CALayer. Ví dụ, hoạt ảnh nền, chỉ báo tải, phần tử trang trí — tất cả đều được triển khai hiệu quả hơn qua CALayer, tránh chi phí của UIView.

Các thuộc tính chính của CALayer

Các thuộc tính cơ bản của CALayer bao gồm khung, định vị, hiển thị và hiệu ứng trực quan. frame xác định vùng hình chữ nhật của layer trong tọa độ cha, bounds xác định tọa độ nội bộ và position xác định tâm của layer. Thay đổi position được tạo hoạt ảnh theo mặc định thông qua hoạt ảnh ngầm định.

  • backgroundColor — màu nền của layer (CGColor). Đặt màu đục với opaque = true loại bỏ pha trộn alpha.
  • cornerRadius — làm tròn góc. Được xử lý bằng phần cứng mà không cần thêm lượt kết xuất.
  • borderWidthborderColor — viền layer. Kết xuất trên GPU, không yêu cầu drawRect.
  • shadowOffset, shadowRadius, shadowOpacity, shadowPath — bóng. Một shadowPath rõ ràng tăng tốc đáng kể quá trình kết xuất.
  • opacity — độ trong suốt của layer từ 0.0 đến 1.0. Được tạo hoạt ảnh mà không gọi drawRect.
  • transform — CATransform3D cho các biến đổi 2D và 3D. Hỗ trợ biến dạng phối cảnh.

Thuộc tính contents cho phép đặt nội dung bitmap trực tiếp — qua CGImage hoặc CIImage. Đây là một giải pháp thay thế cho việc vẽ qua drawRect: nếu hình ảnh đã sẵn sàng, nó có thể được truyền cho contents và Core Animation sẽ kết xuất nó mà không cần xử lý thêm.

Để tạo hoạt ảnh, CABasicAnimation, CAKeyframeAnimationCATransition được sử dụng. Tất cả các lớp này hoạt động thông qua key path thuộc tính của CALayer, cho phép tạo hoạt ảnh cho hầu hết mọi thuộc tính — từ position đến transform.rotation.z.

Các lớp con của CALayer và mục đích của chúng

Apple cung cấp một số lớp con chuyên biệt của CALayer, mỗi lớp giải quyết một tác vụ cụ thể. Chọn lớp con phù hợp thay vì CALayer cơ sở có thể mang lại cải thiện hiệu suất đáng kể nhờ tăng tốc phần cứng.

  • CAShapeLayer — kết xuất hình dạng vector (CGPath) trên GPU. Không yêu cầu bộ đệm riêng — hình dạng được kết xuất như một phần của tổng hợp layer cha.
  • CATextLayer — kết xuất văn bản với khử răng cưa subpixel. Lưu đệm glyph, tăng tốc hiển thị văn bản lặp lại.
  • CAGradientLayer — gradient tuyến tính và xuyên tâm. Kết xuất phần cứng mà không tạo hình ảnh trung gian.
  • CAEmitterLayer — hệ thống hạt trên GPU. Mỗi hạt được kết xuất như một phần tử riêng biệt mà không có sự tham gia của CPU.
  • CAReplicatorLayer — tự động tạo bản sao của các layer con với độ lệch có thể cấu hình về vị trí, màu sắc và thời gian.
  • CATiledLayer — kết xuất hình ảnh lớn theo ô. Chỉ tải và hiển thị các phần nhìn thấy được.

CAReplicatorLayer đặc biệt hữu ích để tạo các mẫu lặp lại mà không trùng lặp mã. Ví dụ, một chỉ báo tải với 10 chấm được triển khai với một CAReplicatorLayer sử dụng instanceCount = 10 và độ lệch thời gian hoạt ảnh instanceDelay.

Kết xuất và tổng hợp CALayer

Kết xuất CALayer diễn ra trong ba giai đoạn. Commit — khi một thuộc tính layer thay đổi, một lô thay đổi được hình thành trên CPU. Render — Core Animation tạo lệnh Metal trên CPU dựa trên các thuộc tính của layer. Composite — GPU thực thi lệnh và xuất khung hình ra màn hình. Toàn bộ quá trình được đồng bộ hóa với tốc độ làm mới màn hình.

Trong quá trình tổng hợp nhiều layer, GPU hợp nhất chúng thành hình ảnh cuối cùng có tính đến độ trong suốt, mặt nạ và chế độ hòa trộn. Nếu một layer có opaque = true, Core Animation tối ưu hóa tổng hợp: thay vì pha trộn alpha, việc thay thế pixel đơn giản được thực hiện, nhanh hơn đáng kể.

Theo Apple Performance Guidelines, các yếu tố chính làm chậm kết xuất CALayer là: hệ thống phân cấp sublayer phức tạp (hơn 30 layer trên màn hình), sử dụng mặt nạ (thuộc tính mask), tính toán bóng tự động không có shadowPath và sử dụng quá mức shouldRasterize cho các layer động.

Core Animation Instrument trong XCode cho phép giám sát thời gian kết xuất của mỗi layer, số lượng bộ đệm offscreen và tần suất gọi drawRect. Thời gian kết xuất tối ưu cho 60 FPS không quá 8 ms trên CPU và 8 ms trên GPU.

Kết xuất offscreen và tác động của nó

Kết xuất offscreen — kết xuất layer vào bộ đệm trung gian trước khi hiển thị trên màn hình. Xảy ra khi sử dụng cornerRadius + masksToBounds với nội dung, độ trong suốt nhóm, mặt nạ và shouldRasterize. Mỗi lượt offscreen mất 2–5 ms, vì vậy kết xuất offscreen quá mức rất quan trọng đối với hiệu suất.

Để chẩn đoán kết xuất offscreen, hãy sử dụng công cụ Color Offscreen-Rendered trong Core Animation Instrument. Layer màu vàng — offscreen, màu xanh lam — kết xuất trực tiếp ra màn hình. Giảm thiểu các lượt offscreen là một kỹ thuật tối ưu hóa chính trong iOS.

Ví dụ mã: làm việc với CALayer trong Swift

Ví dụ đầu tiên minh họa thiết lập CALayer cơ bản với tạo bóng, làm tròn góc và viền. shadowPath được chỉ định rõ ràng để tăng tốc kết xuất:

swift
import UIKit

func configureLayer(_ view: UIView) {
    let layer = view.layer
    layer.cornerRadius = 16
    layer.borderWidth = 2
    layer.borderColor = UIColor.systemBlue.cgColor
    layer.backgroundColor = UIColor.white.cgColor

    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.2
    layer.shadowOffset = CGSize(width: 0, height: 4)
    layer.shadowRadius = 8
    layer.shadowPath = UIBezierPath(
        roundedRect: view.bounds,
        cornerRadius: layer.cornerRadius
    ).cgPath
}

Ví dụ thứ hai hiển thị hoạt ảnh transform thông qua CABasicAnimation với biến đổi 3D phối cảnh. Hoạt ảnh xoay trục Y tạo hiệu ứng lật thẻ:

swift
let flipAnimation = CABasicAnimation(keyPath: "transform")
var transform = CATransform3DIdentity
transform.m34 = -1.0 / 500.0
transform = CATransform3DRotate(transform, .pi, 0, 1, 0)
flipAnimation.toValue = NSValue(caTransform3D: transform)
flipAnimation.duration = 0.8
flipAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
cardLayer.add(flipAnimation, forKey: "flip")

Ví dụ thứ ba minh họa việc sử dụng CAGradientLayer để tạo gradient nền. Gradient kết xuất trên GPU và không yêu cầu tài nguyên bổ sung khi thay đổi kích thước:

swift
func addGradient(to view: UIView, colors: [UIColor]) {
    let gradient = CAGradientLayer()
    gradient.colors = colors.map { $0.cgColor }
    gradient.locations = [0.0, 0.5, 1.0]
    gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
    gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
    gradient.frame = view.bounds
    view.layer.insertSublayer(gradient, at: 0)
}

Câu hỏi thường gặp

CALayer khác UIView như thế nào?

UIView là một wrapper bao quanh CALayer bổ sung xử lý chạm, Auto Layout và tích hợp với UIViewController. CALayer chỉ làm việc với biểu diễn trực quan và hoạt ảnh, khiến nó nhẹ hơn và hiệu quả hơn cho các tác vụ đồ họa thuần túy.

Những thuộc tính CALayer nào tạo hoạt ảnh mà không cần mã bổ sung?

Hơn 40 thuộc tính, bao gồm position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidthborderColor. Hoạt ảnh tự động bắt đầu khi thay đổi thuộc tính trong khối hoạt ảnh UIView.animate.

Làm thế nào để tăng tốc kết xuất bóng của CALayer?

Đặt shadowPath — một đường viền bóng rõ ràng dưới dạng UIBezierPath. Không có shadowPath, Core Animation phân tích kênh alpha của nội dung để tính toán hình dạng bóng, yêu cầu một lượt bổ sung. Với shadowPath, bóng được kết xuất như một hình dạng hình học đơn giản mà không cần phân tích nội dung.

Hoạt ảnh ngầm định trong CALayer là gì?

Hoạt ảnh ngầm định là hoạt ảnh tự động khi thay đổi thuộc tính có thể tạo hoạt ảnh của CALayer bên ngoài khối UIView.animate. Thời lượng mặc định là 0,25 giây. Có thể tắt qua CATransaction.setDisableActions(true) hoặc đặt thời lượng tùy chỉnh qua CATransaction.begin/commit.

Khi nào nên sử dụng CAShapeLayer thay vì CALayer?

CAShapeLayer hiệu quả hơn khi bạn cần hiển thị hình dạng vector — một đường thẳng, hình tròn, đa giác, đường dẫn phức tạp. Nó kết xuất đường dẫn trên GPU mà không tạo bộ đệm raster riêng. CALayer cơ sở phù hợp cho các vùng hình chữ nhật có nền, viền và bóng.

Tóm tắt

  • CALayer là lớp cơ sở cho các layer đồ họa trong iOS, chịu trách nhiệm kết xuất, hoạt ảnh và tổng hợp thông qua Core Animation.
  • Mỗi UIView chứa một CALayer, nhưng layer cũng có thể được sử dụng độc lập cho các phần tử trực quan mà không cần xử lý chạm.
  • Các thuộc tính chính: frame, bounds, backgroundColor, cornerRadius, shadowPath, transform, opacity — tất cả đều có thể tạo hoạt ảnh.
  • Các lớp con chuyên biệt: CAShapeLayer, CATextLayer, CAGradientLayer, CAEmitterLayer, CAReplicatorLayer.
  • Kết xuất trải qua ba giai đoạn: Commit, Render, Composite — tất cả trên GPU thông qua Metal.
  • Kết xuất offscreen xảy ra với mặt nạ, shouldRasterize và độ trong suốt nhóm — hãy giảm thiểu nó để đạt 60 FPS.
  • Một shadowPath rõ ràng tăng tốc kết xuất bóng gấp 2–3 lần so với tính toán tự động.

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