我的应用程序是一款游戏,它包含一个CADisplayLink
计时器,该计时器调用一个函数,指示每帧对屏幕上的各种对象进行大约20次UIView setCenter:
调用。
时间分析,它占游戏中所有活动的大约30%,并且大大降低了旧设备的性能(任何低于第5代ipod touch或iphone的性能)。
我是否可以使用任何轻量级,低开销的替代方案来在屏幕上每帧移动对象(特别是UIViews
)?
修改
为了澄清,这些center
的{{1}}属性必须设置为每个框架。我有很多代表我游戏中的地面的瓷砖。它们在屏幕上拉链,只是被新的瓷砖取代。在摆弄代码几个小时后将UIViews
更改为UIView
s后,我的工作完全没有性能提升。肯定有更好的方法来做到这一点。
一些代码可以概括地了解发生了什么:
CAlayer
正如人们所认为的, for(Object* o in gameController.entities){
[o step:curTimeMS];
}
是一个负责主要游戏功能的课程。它包括实体列表,它们是屏幕上的所有对象。每个实体上的gameController
方法都是虚函数,因此它特定于每个实体 - step
变量只是一个时间戳,因此对象可以计算其delta位置。从本质上讲,每个实体每帧更新其curTimeMS
属性,在屏幕上以适当的速度移动它。
答案 0 :(得分:0)
如果您需要表现,请不要使用UIView
。它不是设计得很快。
相反,只有一个UIView
占据整个屏幕,在一个视图中有一堆CALayer
个对象。移动图层。
CALayer
通过直接与GPU交谈来工作,所以速度非常快。也许比OpenGL更快。 UIView
在内部使用CALayer
,因此它们的行为大致相同。唯一真正的区别是,CALayer
的位置的任何更改都将默认设置为动画。您可以轻松关闭动画,但在游戏中您可能需要动画。
您的另一个选择当然是使用OpenGL。但这还有很多工作要做。
编辑:以下是一些正确更改图层位置的示例代码:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/uid/TP40004514-CH3-SW8
答案 1 :(得分:0)
我会推荐SpriteKit。这是一个very powerful game / 2d animation framework created by apple.。 Cocos2D is also a very powerful framework of similar type. 您可以直接从XC
创建新的SpriteKit游戏如果您只想使用UIKit
内容留在家中,请查看UIView block based animations
。这是它的主旨。
[UIView animateWithDuration:numberOfSecondsTakenToAnimate animations: ^{
// do you animation here. i.e.: move view frame, adjust color.
} completions: ^(BOOL complete) {
// when the animation is complete, code in this block is executed.
}];
我记得Core Graphics。它与UIView
串联使用以创建简单的2D图形,并且非常强大且非常快。这是其中的主旨。
CGContextRef cntxt = UIGraphicsGetCurrentContext();
CGContextBeginPath(cntxt);
CGContextMoveToPoint(cntxt, <x>, <y>);
CGContextAddLineToPoint(cntxt, <x>, <y>);
CGContextClosePath(cntxt);
[[UIColor <color>] setFill];
[[UIColor <color>] setStroke];
CGContextDrawPath(cntxt, kCGPathFillStroke);
注意:&lt; &GT;是您指定的变量/值。
如果你想全力以赴,take the time to learn Open GL。请注意,我听说这很难学。