同时处理 drag/move 个对象的最有效方法是什么?

What’s the most efficient method to drag/move objects simultaneously?

这更像是一个一般的设计问题,而不是关于一段代码的特定问题。让我做一个提纲:

想象一条 canvas 有一条由 3 个或更多点组成的折线。这些点中的每一个都有一个圆形对象作为可拖动的手柄。用户可以移动拖动手柄,该操作会更新仅包含这 3 个坐标的反应上下文。新上下文触发 canvas 的重绘,使用新坐标更新多边形线和拖动手柄,同时在拖动发生时执行诸如“捕捉到轴”和“捕捉到最近的其他矢量”检查之类的事情。

我只使用功能组件 (React.FC) 并且在需要时使用挂钩共享状态。

我在拖动处理程序上使用 requestAnimationFrame() 来使更新尽可能接近客户端的最大刷新率。目标是保持在 60fps。

问题:

在 react-konva 中重新渲染附加到舞台的组件是否总是会触发实际 canvas 上所有内容的重绘,或者 react-konva 是否保持跟踪?

在这种情况下,是否建议使用 vanilla Konva 而不是 react-konva 抽象,以避免过度重绘,同时在拖动操作结束后仅使用 react 上下文来持久化状态?

有没有更有效的方法来处理我目前不知道的这个用例?

当您重新渲染组件时,它会触发内部更新 react-konva

react-konva 将更新 Konva 个节点的属性。它试图聪明地工作,所以如果你重新渲染一个组件,但没有改变道具 - Konva 节点将不会更新(并且没有 canvas 绘制)。

道具的任何变化都会触发图层(或舞台)重绘。

如果您想拥有完全控制权并且想跳过一些 React 协调器工作,则可以使用原版 Konva 而不是 react-konva。但在大型组件上可能很难。

此外,最好避免使用React.Context进行频繁更新。更新上下文可能会触发大量的组件重新渲染。所以最好使用普通状态(甚至 mobx)来获得更快的更新。