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

时间:2015-01-18 10:34:46

标签: objective-c core-graphics quartz-graphics mousemove cgimage

Image example

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

由于所有这些计算,不仅会动态绘制延迟,而且会在重新计算和动态重新定位时“跳转”。 我想出了一个解决方案,通过绘制4条简单的线到各种计算点稳定外部框,但问题在于其他一切。

该框将包含各种其他形状和线条,并且在移动鼠标时重新计算每个要调整大小的框架似乎单调乏味且效率低下。我想知道最好的做法是实现是否使用CGLayer或CGImageRef,以及如何实现它们?

主要的问题是我做了很多计算,而鼠标移动时图像非常明显地落后,甚至在动态渲染所有内容时跳转。

1 个答案:

答案 0 :(得分:1)

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

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

  2. 为了响应重绘事件,您可以使用设置的参考点绘制形状。

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

    假设您的计算和绘图方法效率更高或更低,并且无法优化以实现200ms的执行时间,您需要在形状移动期间采用简化显示,即一旦开始移动形状或更改是尺寸,出现重叠的轮廓,快速跟随鼠标移动。它不显示最终形状,而是简化轮廓。轮廓足以定位形状。释放鼠标按钮后,将开始实际计算,并在短暂延迟后显示最终形状。

    在这种情况下,实施起来有点困难:

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

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

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

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