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

问题描述 投票:0回答:1

Image example(来源:unt.edu

我正在使用CGContextAddLineToPoint调用在Core Graphics中绘制以上图像。图像本身并不重要。但是,程序中形状的方式取决于鼠标移动的位置。问题开始于旋转图像后,当用户调整角落的大小时,在移动鼠标时需要重新计算并渲染所有内容。并且有很多计算工作要做。

由于所有这些计算,不仅会动态产生滞后,还会在重新计算和动态定位时“跳动”。我想出了一种解决方案,可以通过绘制4条简单的线到各个计算出的点来稳定外框,但问题出在其他所有方面。

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

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

objective-c core-graphics mousemove cgimage
1个回答
2
投票

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

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

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

这是一种可靠的方法。它不会通过一次计算多个形状位置来阻塞CPU。但是,如果无法在几分之一秒(即200ms或更短的时间内)内计算出新的参考点或重新粉刷更改后的形状,就会发现延迟很大。可见形状将滞后于鼠标位置。

假设您的计算和绘图方法或多或少地有效,并且无法针对200ms的执行时间进行优化,则需要在形状移动过程中采用简化的显示方式,即,一旦开始移动形状或更改尺寸,将出现覆盖的轮廓,该轮廓快速跟随鼠标的移动。它不显示最终形状,而是显示简化的轮廓。轮廓足以放置形状。释放鼠标按钮后,便会开始实际计算,并在短暂的延迟后显示最终形状。

在这种情况下,实现起来有些困难:

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

  2. 为响应repaint event,您将绘制旧形状(存储在CGImage中)并在顶部绘制轮廓。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.