Эффективность рисования графиков в Swift в Swift
У меня есть неориентированный график данных, которые я пытаюсь визуализировать в приложении для iOS. В настоящее время у меня есть рабочее решение, использующее модель рисования графика с принудительным направлением, описанную здесь: https://en.wikipedia.org/wiki/Force-directed_graph_drawing
Вот как я сейчас обновляю модель представления, используя Grand Central Dispatch:
// Run at the initialization of the View Model. Aysnchronously updates node forces and postions on a timer.
private func rebalance(){
DispatchQueue.main.asyncAfter(deadline: .now() + 0.001, execute: {
self.physicsEngine?.updateAllForces() //Calculated the net force on every node in the system and stores the value to each node
self.iterate()
self.rebalance()
})
}
// Iterates the positions of all the nodes based on force and velocity
private func iterate(){
for node in self.nodes.values{
_ = node.updatePosition() //Updates the position of the node using the computed force
}
}
Теперь я хорошо понимаю, что не стоит так много обрабатывать в главном потоке. На данный момент я даже замечаю какое-либо замедление после расширения до>30 узлов в моем наборе данных, но я хотел бы иметь возможность масштабировать это решение для многих узлов, если это необходимо. Выполнение этого на симуляторе Xcode почти сразу включает все вентиляторы на моем MacBook и показывает, что имитированный процессор почти на 100%.
С тех пор я пытался вычислить позиции для узлов в фоновом режиме, но я относительно новичок в Swift (и GCD), поэтому изо всех сил пытаюсь создать более эффективное решение.
У кого-нибудь есть идеи, используя Grand Central Dispatch или иным образом, о том, как более эффективно выполнять итерацию позиций узлов в моей системе, в идеале, все еще используя модель рисования на основе силы? Спасибо.