gpt4 book ai didi

ios - 使用 UIImageViews 和框架或 CALayers 或其他东西?

转载 作者:行者123 更新时间:2023-11-28 22:13:44 24 4
gpt4 key购买 nike

所以我制作了一个非常简单的 iOS 游戏,其中有多个对象在屏幕上滚动并检查沿途是否发生碰撞。目前要移动它们,我有一个 NSTimer,它每 0.01 秒左右触发一次并将帧移动 2 个像素。然后它会检查玩家的位置以寻找相交的帧并采取相应的行动。

这非常有效,我在自己的设备上使用它没有任何问题,但是我注意到,当屏幕上有超过 20 个对象在旧设备上同时移动时,有时会出现延迟(例如iPad 3,例如)。


分析应用后,似乎有大约 70% 的 CPU 分配给了这个线程。这是正常的吗?如果我将每个对象添加到单个固定 View 上的 CALayer 并更新该层上的位置,而不是让 25-30 个单独的 UIImageView 在屏幕上同时移动,是否会减少 CPU 的负载?或者有更好的方法吗?

我想我会先问一下,然后再麻烦将我的所有代码转换为使用图层。有没有人有过在旧设备上编写这样的游戏而没有任何延迟的经验?

我想支持尽可能多的设备,但较旧的设备似乎很难运行(我觉得这很奇怪,因为与我制作的其他游戏相比,这款游戏非常简单)。

附加信息:

Deployment Target: 5.0
iPad Device iOS: 7.0.6
iPhone 5 Device iOS: 7.0.6
XCode Version: 5.0.2


这是在触发计时器时运行的代码。 CView 基本上是一个带有一些额外的 int/bool 属性的 UIImageView。

for(CView* c in self.view.subviews)
{
if(![c isKindOfClass: [CView class]])
{
continue;
}

[c setFrame:[CRect rect:c.frame withNewY:c.frame.origin.y+2]];

if(fabsf(c.frame.origin.y + c.frame.size.height - (player.frame.origin.y+player.frame.size.height)) <= player.frame.size.height)
{
if([player collideWith:c.x])
[self gameOver];
}
else if((c.frame.origin.y + c.frame.size.height) > (player.frame.origin.y + player.frame.size.height) && c.passed == NO)
{
c.passed = YES;
score++;
}

if(c.frame.origin.y > [CRect height])
{
[self removeView:c];
}
}

if(score != score2)
[scoreLabel setText:[NSString stringWithFormat:@"%d",score]];

score2 = score;

reps++;
if(reps < 0)
return;

NSArray* formation = [formations objectAtIndex:(int)[Global randomFloatBetween:0 andLarge:11.99]];

float max = 0;

for(int i = 0; i < formation.count; i++)
{
if([[formation objectAtIndex:i] intValue] == -1)
continue;

if([[formation objectAtIndex:i] floatValue] > max)
max = [[formation objectAtIndex:i] floatValue];

float x = [CRect centerX:(player.laneWidth*5)+(player.lineWidth*4)] + ((i) * (player.xWidth+player.lineWidth)) + player.margin;
float y = -101 + ([[formation objectAtIndex:i] floatValue] * (-130));

CView* c = [[CView alloc] initWithFrame:CGRectMake(x, y, 49, 101)];
[c setX:i+1];
[c setImage:[images objectAtIndex:(int)[Global randomFloatBetween:0 andLarge:images.count-0.01]]];
[self.view insertSubview:c belowSubview:adBanner];
}

reps = (-101 * (max+1)) - 202;
reps /= 1.75;

这是否与我以这种方式创建 CViews 并在它们离开屏幕时使它们无效有关?如果我要使用一个固定的数字并重新使用旧的 CViews(只需将它们放在屏幕的另一端并在它们完成交叉时重新运行它们)是否会提高性能?我不知道 ARC 多久收集一次垃圾。

最佳答案

您应该考虑使用现有的游戏引擎,例如 cocos-2d,或者花时间使用通用模式和最佳实践来改进您自己的引擎。如果您决定使用现有引擎,除了阅读他们的文档并在遇到困难时询问具体问题外,没有什么可说的了。不要问有关使用什么引擎的问题。这类问题不适合 Stack Overflow。

如果您继续使用自己的引擎,那么我仍然建议您研究 cocos-2d 和 Sprite Kit 的文档和编程指南。这将帮助您构建自己的引擎。例如,这是 Sprite Kit 编程指南中解释游戏循环的图片。

enter image description here

如果您有兴趣使用 Core Animation 编写游戏引擎,那么我建议您阅读 this series of blog posts by Matt Gallagher .它已经有几年历史了,但应该仍然很重要。

当您按照这些步骤构建您的游戏引擎时

  1. 更新(移动东西)
  2. Action (响应用户交互)
  3. 模拟(碰撞检测)
  4. 渲染

然后您可以开始测量不同步骤的性能和内存效率,并继续处理最重的部分,直到达到可接受的性能。

也许值得在 View 移出屏幕时重用它们,也许您的碰撞检测过于昂贵并且应该进行优化,也许移动到图层是值得的。您必须先进行衡量,才能知道将时间和精力花在哪里。

但是,我会告诉您,您应该放弃 NSTimer 并为游戏循环使用单个 CADisplayLink 以保持更新与显示同步。


作为旁注:

I don't know how often ARC collects garbage.

这句话让我很担心。说明你还没有了解ARC是什么以及它是如何工作的。 ARC 不是垃圾收集器。我建议您回头再看一下 Objective-C 中的内存管理

关于ios - 使用 UIImageViews 和框架或 CALayers 或其他东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com