核心图形。使用鼠标移动事件动态绘制的最佳实践?

Core Graphics. Best practice for drawing dynamically with mouse move event?


(来源:unt.edu

我正在使用 CGContextAddLineToPoint 调用在 Core Graphics 中绘制上面的图像。图片本身并不重要。然而,它在程序中的方式是基于鼠标移动的位置。问题开始于图像旋转后,当用户调整角的大小时,在移动鼠标时需要重新计算和渲染所有内容。还有很多计算要做。

由于所有这些计算,不仅动态绘图会滞后,而且 'jump around' 在动态重新计算和重新定位时也会出现滞后。 我想出了一个解决方案,通过在各种计算点上绘制 4 条简单的线来稳定外箱,但问题出在其他所有方面。

该框将包含各种其他形状和线条,并且在移动鼠标时重新计算每个形状和线条以调整其大小似乎很乏味且效率低下。我想知道为此使用 CGLayer 还是 CGImageRef 实现的最佳实践是什么,以及如何实现它们?

主要问题是我在鼠标移动时进行了太多计算,以至于在动态渲染所有内容时图像明显滞后甚至跳来跳去。

在典型的绘图应用程序中,您处理两个 UI 事件:

  1. 响应鼠标移动事件,您为形状设置新的参考点(原点、旋转等)并要求系统重新绘制受影响的区域

  2. 响应 repaint 事件,您使用设置的参考点绘制形状。

这是一种可靠的方法。它不会通过一次计算多个形状位置来阻塞您的 CPU。但是,如果计算新参考点或重新绘制更改后的形状不能在几分之一秒内完成(即 200 毫秒或更短时间),您会注意到相当大的延迟。可见形状会滞后于鼠标位置。

假设你的计算和绘图方法或多或少有效率,无法优化以实现 200 毫秒的执行时间,你需要在形状移动期间求助于简化显示,即一旦你开始移动形状或变化是尺寸,会出现一个重叠的轮廓,它会快速跟随鼠标移动。它不显示最终形状,而是显示简化的轮廓。轮廓足以定位形状。松开鼠标按钮后,真正的计算开始,经过短暂延迟后,显示最终形状。

在这种情况下,实现起来比较困难:

  1. 响应鼠标移动事件,您为轮廓设置新的参考点并要求系统重新绘制受影响的区域。

  2. 响应重绘事件,您绘制旧形状(存储在 CGImage 中)加上顶部的轮廓。

  3. 响应鼠标弹起事件,您启动一​​个单独的线程来重新计算形状坐标并将其绘制到 CGImage 中。

  4. 线程完成后,要求系统重新绘制受影响的区域。现在绘制新图像(没有轮廓)。