Движение карт на основе плитки замедляется с помощью UIImage - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть следующий код, который рисует кучу плиток 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 ]

1 голос
/ 28 февраля 2012

Ваша идея использования cocos2d хороша, и это очень хорошая структура и, вероятно, хорошо подходит для других проблем, с которыми вы можете столкнуться.Но ... почему бы нам не обсудить, почему у вас так много проблем.

Вы используете отдельный UIImageView для каждой плитки.UIImage хорошо, и довольно эффективно для большинства целей.Но полный просмотр каждой плитки довольно дорогой.Хуже того, каждый раз, когда вы звоните updateView, вы берете все и выбрасываете.Это очень, очень дорого.

Точно так же, как первый шаг, потому что вам легко исправить, настроить все виды изображений в начале и сохранить их в массиве.Затем в displayMonsters просто измените их местоположение и изображения, а не удаляйте их и создавайте новые.Я подозреваю, что это значительно улучшит вашу производительность.

Если вам все еще нужно больше производительности, вы можете перейти на использование CALayer вместо UIImageView.Вы можете очень легко создать CALayer и установить для contents значение aImg.CGImage.Опять же, вы бы добавили группу CALayer объектов с [view.layer addSublayer:layer], точно так же, как добавление представлений.Слои намного дешевле, чем представления, потому что они не обрабатывают такие вещи, как сенсорные события.Они просто рисуют.

Но если вы ожидаете, что вам понадобится более изящная 2D-графика, в Cocos2D все в порядке.

0 голосов
/ 28 февраля 2012

Это медленно, потому что использование UIImage для множества листов карты имеет много накладных расходов. Лучше всего рисовать все, используя OpenGL и вершинные буферы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...