替代UIView setCenter

时间:2014-04-18 03:06:31

标签: ios iphone objective-c performance uiview

我的应用程序是一款游戏,它包含一个CADisplayLink计时器,该计时器调用一个函数,指示每帧对屏幕上的各种对象进行大约20次UIView setCenter:调用。

时间分析,它占游戏中所有活动的大约30%,并且大大降低了旧设备的性能(任何低于第5代ipod touch或iphone的性能)。

我是否可以使用任何轻量级,低开销的替代方案来在屏幕上每帧移动对象(特别是UIViews)?

修改

为了澄清,这些center的{​​{1}}属性必须设置为每个框架。我有很多代表我游戏中的地面的瓷砖。它们在屏幕上拉链,只是被新的瓷砖取代。在摆弄代码几个小时后将UIViews更改为UIView s后,我的工作完全没有性能提升。肯定有更好的方法来做到这一点。

a section of the Time Profile stack trace

一些代码可以概括地了解发生了什么:

CAlayer
正如人们所认为的,

for(Object* o in gameController.entities){ [o step:curTimeMS]; } 是一个负责主要游戏功能的课程。它包括实体列表,它们是屏幕上的所有对象。每个实体上的gameController方法都是虚函数,因此它特定于每个实体 - step变量只是一个时间戳,因此对象可以计算其delta位置。从本质上讲,每个实体每帧更新其curTimeMS属性,在屏幕上以适当的速度移动它。

2 个答案:

答案 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 enter image description here

创建新的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。请注意,我听说这很难学。