基于平铺的地图运动与UIImage一起缓慢

时间:2012-02-28 01:22:49

标签: objective-c

我有以下代码,每次触摸屏幕时都会在屏幕上绘制一堆uiimage图块(它是一个探索图块地牢的角色)。但是如果我快速点击,那么这个动作会非常激动。为什么它表现得很迟钝。

感谢。

- (void) updateView {
// lets remove all subviews and start fresh
for (UIView *subview in self.view.subviews)
    [subview removeFromSuperview];

[self drawVisibleDungeon];
[self displayMonsters];

[self drawPlayer];
[self.view setNeedsDisplay];

[self.view addSubview:messageDisplay];
[self.view addSubview:miniMap];
[miniMap setNeedsDisplay];
}   

- (void) processTouchAtX: (int)x AndY: (int)y
{
int tempx = 0;
int tempy = 0;

if (x > 4)
    tempx++;
if (x < 4)
    tempx--;
if (y > 6)
    tempy++;
if (y < 6)
    tempy--;    

[[[self _accessHook] dungeonReference]processOneTurnWithX:tempx AndY:tempy];
[self updateView];
}

- (void) displayMonsters
{
UIImage *aImg;
int x, y;
NSString *aString;
int monCount = [[[_accessHook dungeonReference]aDungeonLevel]monsterCount];
NSMutableArray *monArray = [[[_accessHook dungeonReference]aDungeonLevel]mArray];
int player_x_loc = [[[self _accessHook] dungeonReference] thePlayer].x_location;
int player_y_loc = [[[self _accessHook] dungeonReference] thePlayer].y_location;

for (int i=0; i<monCount; i++)
{
    x = [[monArray objectAtIndex: i] x_loc];
    y = [[monArray objectAtIndex: i] y_loc];

    if ([self LOSFrom:CGPointMake(x, y)])
        if ((x >= player_x_loc-4) && (x < (player_x_loc+5)) && (y >= player_y_loc-6) && (y < (player_y_loc+6)))
        {
            UIImageView *imgView=[[UIImageView alloc]init];
            aString = [[monArray objectAtIndex:i]monsterPicture];
            aImg = [UIImage imageNamed:aString];
            imgView.frame=CGRectMake((x - (player_x_loc-4))*32, (y - (player_y_loc-6))*32, 32, 32);
            imgView.image = aImg;
            [self.view addSubview:imgView];
            [self.view bringSubviewToFront:imgView];
            [imgView release];
        }
}
}

2 个答案:

答案 0 :(得分:1)

您使用cocos2d的想法很好,这是一个非常好的框架,可能非常适合您可能遇到的其他问题。但是......为什么我们不讨论为什么你会遇到这么多麻烦呢。

您为每个磁贴使用单独的UIImageViewUIImage很好,而且对于大多数用途来说非常有效。但是每个瓷砖的完整视图都非常昂贵。更糟糕的是,每当你打电话给updateView时,你都会把所有东西扔掉。这非常非常昂贵。

就像第一步一样,因为它很容易修复,所以在开始时设置所有图像视图并将它们存储在一个数组中。然后在displayMonsters中,只需更改其位置和图片,而不是删除它们并创建新的位置和图像。这本身就会大大改善你的表现,我怀疑。

如果您仍需要更高的性能,可以切换为使用CALayer而不是UIImageView。您可以非常轻松地创建CALayer并将其contents设置为aImg.CGImage。同样,您将添加一堆CALayer[view.layer addSublayer:layer]个对象,就像添加视图一样。图层比视图便宜得多,因为它们不处理触摸事件等事情。他们只是画画。

但如果您预计需要更漂亮的2D图形,Cocos2D没有任何问题。

答案 1 :(得分:0)

这很慢,因为在一堆地图图块中使用UIImage会产生很多开销。最好使用OpenGL和顶点缓冲区绘制所有内容。