Есть ли рекомендуемые способы рисования 2d массива в короткие сроки? - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу нарисовать 2d массив на iOS в скором времени. 2d массив похож на тепловая карта , карта глубины или карта сегментации , и т. Д. c.

В моем случае с UIKit framework, рисующий массив большого размера, например 500x500 shape, слишком медленный.

// my solution, but it's too slow
override func draw(_ rect: CGRect) {

    guard let ctx = UIGraphicsGetCurrentContext(),
        let heatmap = self.heatmap else { return }

    ctx.clear(rect);

    let size = self.bounds.size
    let heatmap_w = heatmap.count
    let heatmap_h = heatmap.first?.count ?? 0
    let w = size.width / CGFloat(heatmap_w)
    let h = size.height / CGFloat(heatmap_h)

    for j in 0..<heatmap_w {
        for i in 0..<heatmap_h {
            let value = heatmap[i][j]
            let alpha: CGFloat = CGFloat(value)
            guard alpha > 0 else { continue; }

            let rect: CGRect = CGRect(x: CGFloat(i) * w, y: CGFloat(j) * h, width: w, height: h)

            let color: UIColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: alpha*0.58)

            let bpath: UIBezierPath = UIBezierPath(rect: rect)

            color.set()
            bpath.stroke()
            bpath.fill()
        }
    }

} // end of draw(rect:)

Я думаю, Metal или CoreGraphics framework связаны с этой проблемой, но я не смог найти правильный пример или материал. Есть ли рекомендуемые способы?

пример тепловой карты

depthmap example

1 Ответ

1 голос
/ 11 апреля 2020

Лучшим способом является использование Metal Compute Function для достижения максимальной производительности. У Apple есть хороший учебник , который показывает основы. Кроме того, вы можете использовать Metal Performance Shaders для реализации пользовательских функций рендеринга или для использования большой библиотеки существующих функций.

...