Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] CALayer 성능 향상 방법 (shouldRasterize, rasterizeationScale, draw) 본문

iOS 응용 (swift)

[iOS - swift] CALayer 성능 향상 방법 (shouldRasterize, rasterizeationScale, draw)

jake-kim 2024. 2. 16. 01:34

shouldRasterize 개념

  • CALayer의 bool 프로퍼티
open class CALayer : NSObject, NSSecureCoding, CAMediaTiming {
    open var shouldRasterize: Bool
}
  • compositing전에 bitmap으로 만들고 이 bitmap을 활용하여 화면에 그림을 그릴지 여부 (default값은 false)
    • *compositiong: 여러 개의 그래픽 요소를 하나의 이미지로 결합하는 프로세스를 의미

https://developer.apple.com/documentation/quartzcore/calayer/1410905-shouldrasterize

  • shouldRasterize를 true로 하게되면 CALayer들을 픽셀로 판단하여 bitmap으로 변환하여 그림을 그림
    • CALayer를 통해 매우 복잡한 그림을 그려야할때 true로 사용하는것이 유리 (CALayer에 의해서 다양한 그림을 그릴때 그 그림들을 일일이 그리는것보단 단순히 픽셀로 변환하는것이 더욱 간편하기 때문)
    • 단, 뷰의 내용이 빈번하게 바뀌는 경우 bitmap도 계속 바뀌므로 잘 변경되지 않는 뷰에서만 true로 사용할 것

shouldRasterize를 true로 쓰는 예제

  • CALayer를 통해 그림을 그리는 뷰 준비
    • 단, shouldRasterize는 그림이 복잡한 뷰에서 사용하는것이 좋지만 예제 편의상 간단한 삼각형 형태의 그림을 그리는 코드로 준비
class CustomView: UIView {
    override func draw(_ rect: CGRect) {
         let trianglePath = UIBezierPath()
         trianglePath.move(to: CGPoint(x: rect.midX, y: rect.minY))
         trianglePath.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
         trianglePath.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
         trianglePath.close()

         let fillColor = UIColor.red
         fillColor.setFill()

         trianglePath.fill()
    }
}
  • 사용하는쪽
    • shouldRasterize를 true로 설정
    • rasterizationScale도 역시 화면의 해상도 스케일을 설정하여 디바이스의 해상도 (2배, 3배) 고려하여 rasterization하도록 설정하면 완료
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let customView = CustomView(frame: CGRect(x: 50, y: 50, width: 200, height: 200))
        customView.backgroundColor = UIColor.clear
        view.addSubview(customView)

        customView.layer.shouldRasterize = true
        customView.layer.rasterizationScale = UIScreen.main.scale
    }
}

* 전체 코드: https://github.com/JK0369/ExRasterize

* 참고

- https://developer.apple.com/documentation/uikit/uiimage/1624092-draw

- https://developer.apple.com/documentation/quartzcore/calayer/1410905-shouldrasterize

- https://ko.wikipedia.org/wiki/%EB%B9%84%ED%8A%B8%EB%A7%B5

 

Comments