我在 iPhone 上设置了一个非常简单的“游戏”。物体四处移动,旋转,您可以与它们进行交互等。在模拟器中,它运行良好,但在设备上它达到 0.25 FPS 左右,而且速度非常慢,显然没有时间识别触摸。
这最初只是使用带有Item
s 数组的 UIView,每个数组都有一个 Tick 和一个 Draw 函数。在应用程序开始时,我启动了一个以 60 FPS 拍摄的 Timer,它调用 Tick,在 Tick 结束时,它调用[self setNeedsDisplay];
它工作得非常慢,所以我把这个Item
类变成了这个类的一个子CALayer
类,移动图层而不是重绘项目。但是,我是CALayer
逐帧手动移动的,这显然不好。还是太慢了。所以我告诉它移动到它的最终目的地,并给它一个与到达那里所需的滴答数相等的长度。
这没问题,但是在某些情况下,如果您与某物交互,它应该停止以这种方式移动并转而做其他事情。所以我回到移动每个刻度,而不是仅仅设置新位置,我还将它包装在一个 CATransaction 中,并赋予交易与刻度相同的长度。
工作正常,但出现了新问题:如果我想为某些东西制作动画,我仍然必须在每个滴答声中使用 [self setNeedsDisplay] ,它调用drawInContext:
,这似乎是一个主要的减速问题。
难道没有一种方法可以像我以前那样手动绘制所有内容吗?我只是在进行 CGContext* 调用,它在模拟器中运行良好!如果我在 J2ME 或嵌入式 C++ 中实现类似的东西,它会工作得很好。我错过了什么?我真的需要学习 OpenGL 来制作任何有趣的手动动画吗?