使用 Core Graphics 以 30-60 fps 手动移动/旋转物体

Posted

技术标签:

【中文标题】使用 Core Graphics 以 30-60 fps 手动移动/旋转物体【英文标题】:Manually moving/rotating stuff at 30-60 fps using Core Graphics 【发布时间】:2011-06-02 11:15:26 【问题描述】:

我有一个循环在一个单独的线程上运行,更新东西的位置和旋转,它以足够多的 FPS 运行,最后在主线程上调用 setNeedsDisplay。问题是框​​架调用 drawRect 的次数不够多,平均我每秒调用 10 个 drawRect (FPS)。我尝试调用 CATransaction 刷新,但它似乎根本没有效果。

我正在做的绘图是 CGContextShowTextAtPoint。差不多就是这样,在旋转上下文等之后。我有什么办法让它以更高的频率绘制吗?我不想使用 openGL 或 cocos2d,因为绘图代码工作得很好。

【问题讨论】:

会不会是你的独立线程占用了 CPU,所以主循环(gui 线程)没有足够的时间来绘制? 【参考方案1】:

我建议在主线程上设置一个 NSTimer,以便每隔 1.0/301.0/60 秒调用一次 drawRect。

也许在单独的线程上运行的代码对整个系统来说太辛苦了。因此,主线程没有足够的计算资源来足够频繁地更新视图。如果从未显示额外的数据帧,“足够多的 FPS”可能只是浪费计算。单独的线程可以在更新位置和旋转后暂停,等待主线程更新视图,然后再计算下一个位置和旋转吗? NSTimer 可以向第二个线程发送消息以计算下一帧的数据。

【讨论】:

设置 NSTimer 每秒没有给我足够的调用次数(这就是我目前使用单独线程的原因)。据我了解,实际上,这是同样的问题,因为如果我没记错的话,每次运行循环的迭代都会调用一次 drawRect ,并且每次迭代也不能多次调用 NSTimer 的回调运行循环...显式调用 drawRect 不好。【参考方案2】:

调用 setNeedsDisplay 不会导致视图立即重绘,它只是将视图标记为脏,这将导致它在下一个绘图周期被重绘。

我认为使用 setNeedsDisplay 方法很难实现快速流畅的动画效果。

您是否尝试过使用核心动画来代替?

最后一点:如果您使用 setNeedsDisplay,请确保始终从主线程调用它。

【讨论】:

【参考方案3】:

我最终使用 Cocos2d 来制作旋转等动画。似乎使用 Core Graphics 以这些 FPS 速率手动移动东西太痛苦了,并且需要一些骇人听闻的方法。

【讨论】:

以上是关于使用 Core Graphics 以 30-60 fps 手动移动/旋转物体的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Graphics 绘制 UIImage?

带有 Core Graphics 绘图的 Core Animation

如何使用 Core Graphics 绘制箭头?

使用 Core Graphics 在 UIImage 上绘制矩形

使用 Core Graphics 制作类似画笔的纹理

媒体层:Core Graphics(绘图)