我有一个自定义视图,其中有一个钢琴键盘画在里面。每个键都被绘制为一个单独的调用,因此我只能绘制需要重绘的键。该视图支持多点触摸,因此可以一次按下多个键。
每个键的绘制成本都比较高,所以每当检测到视图上的触摸时,我都会将一个特定的区域传递给setNeedsDisplay,以避免重新绘制整个视图(这会产生明显的滞后)。
为了处理多个触摸,我迭代了接收到的触摸集合,检查每个触摸是否在其中一个键内,如果是,则更新它并使用该键的矩形调用setNeedsDisplay。简而言之,setNeedsDisplay在一个函数中被多次调用,但每次使用不同的rect。
我所期望的行为是,drawRect将在不同的脏区域被多次调用,然而,似乎如果我同时按下最左边和最右边的键,整个视图将被重新绘制,而不仅仅是最左边和最右边的键(就像在中一样,中间的所有键都被不必要地重新绘制)。
我能做些什么来实现我想要的?我只想绘制被触摸的键,而不是两个脏键之间的所有键。
发布于 2012-06-16 09:19:50
我遇到了这个问题,并把我的问题发到了here上。
奇怪的是,我还画了一个键盘(有88个键)。我从来没有解决过它,并决定如果它被证明是一个性能问题,我会处理它(不要优化,直到你需要等)。我做的一件事是在启动时,将默认键盘渲染成一个图像,并将其作为基础,因此我只绘制按下的键,而不是整个键盘。绘制图像比所有CGPath的东西都要快。
我在播放时显示了midi音符,性能很好-所以你现在可能不需要担心@ this。
发布于 2012-06-16 10:22:21
无论您调用setNeedsDisplayInRect:多少次,系统都会在每次运行主循环时向您发送一条drawRect:消息。它传递给您一个rect,它至少是您传递给setNeedsDisplayInRect:的所有脏rect的“并集”。系统无法准确地找出哪些rects被传递给了setNeedsDisplayInRect:。
您可以重写setNeedsDisplayInRect:以保留一个脏rects数组(您会发现+[NSValue valueWithCGRect:]很有用),并在drawRect:中清除该数组。
您可以创建自己的setNeedsDisplayForKey:方法,该方法保留一组脏键并调用setNeedsDisplay。
https://stackoverflow.com/questions/11059914
复制相似问题