Ускорить функцию IOS - PullRequest
       3

Ускорить функцию IOS

2 голосов
/ 14 декабря 2011

Мне очень нужна помощь с этим! Я строю карту, содержащую множество плиток .. как 200x200 маленьких плиток 50px. Эти плитки находятся в UIScrollView, так что я могу перемещаться по карте! Работает действительно хорошо, верно? Ну, это очень медленно, так как на карте слишком много подпредставлений.

Правильно, поэтому я загружаю подпредставления при прокрутке! Проблема в том, что это занимает некоторое время, делает прокрутку немного медленной / медленной. Можете ли вы помочь мне улучшить эту функцию? У меня нет идей. Нашел Grand Central Dispatch, но я не знаю, как им пользоваться.

Вот мой код

-(void)loadMapTiles {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(1, queue, 
               ^(size_t row) {
                   int radiusX = 11;
                   int radiusY = 7;
                   int y = currentCoord.y-radiusY;
                   for(int x = currentCoord.x-radiusX; x < currentCoord.x+radiusX+1; x++) {
                       int currTag = mapSize.width*(y-1)+x;
                       if(![mapScroller viewWithTag:currTag]) {
                           UIImageView *mapTile = [[UIImageView alloc] initWithFrame:CGRectMake(50*x, 50*y, 50, 50)];
                           int mapNo = (rand() % 20) + 1;
                           if(mapNo > 11) {
                               mapNo = 1;
                           }

                           mapTile.image = [UIImage imageNamed:[NSString stringWithFormat:@"desert_map%d_50.gif", mapNo]];

                           //Tag the mapTile so that we can find it again!
                           [mapTile setTag:currTag];

                           [mapContentView addSubview:mapTile];
                           [mapTile release];
                       }
                       if(x == currentCoord.x+radiusX && y < currentCoord.y+radiusY) {
                           x = currentCoord.x-radiusX-1;
                           y++;
                       }
                   }
                   //Remove the other tiles outside the radius!
                   for (UIView *mapTile in [mapContentView subviews]) {
                       if(mapTile.frame.origin.x / 50 < currentCoord.x-radiusX || mapTile.frame.origin.x / 50 > currentCoord.x+radiusX || mapTile.frame.origin.y / 50 < currentCoord.y-radiusY || mapTile.frame.origin.y / 50 > currentCoord.y+radiusY) {
                           [mapTile removeFromSuperview];
                       }
                   }
               });
}

И функция для вызова функции построения карты выше:

-(void)scrollViewDidScroll:(UIScrollView *)myScrollView {  
    CGPoint newCoord = CGPointMake((int)(myScrollView.contentOffset.x + myScrollView.frame.size.width/2) /50, (int)(myScrollView.contentOffset.y + myScrollView.frame.size.height/2) /50);
    if(newCoord.x != currentCoord.x || newCoord.y != currentCoord.y) {
        currentCoord = newCoord;
        [self loadMapTiles];
    }
}  

Ответы [ 4 ]

4 голосов
/ 15 декабря 2011

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

1 голос
/ 15 декабря 2011

Возможно, вам следует попробовать использовать CoreGraphics и слои вместо scrollview, чтобы нарисовать карту и прокрутить ее.

1 голос
/ 14 декабря 2011

Я не являюсь разработчиком obj-c, но ...

Во время моего недавнего разговора о разработке мобильных веб-приложений они рекомендовали повторно использовать память, а не выделять и освобождать ее.

Вместо того, чтобы создавать новый UIImageView для каждой плитки, вы могли бы иметь достаточно их предварительно выделенных для всего экрана и просто изменять изображения в них при прокрутке карты?

0 голосов
/ 17 декабря 2011

Посмотрите видео WWDC 2010 «Проектирование приложений с помощью scrollviews» и соответствующий пример кода «PhotoScroller», где вы узнаете о хитрости «повторного использования представления» в scrollViews.Видео с аналогичным названием WWDC 2011 является продолжением того же трюка.

"Представления, которые больше не находятся в видимой области, следует повторно использовать и перемещать для отображения новых материалов"

Добавление и удаление подпредставленийв то время как прокрутка неизбежно приведет к замедлению.Вместо этого вы должны просто изменить положение невидимых и показать новые вещи.

Другими обычными причинами проблем с прокруткой являются

layer.cornerRadius layer.shadow (без установки shadowPath) любая непрозрачность для подпредставлений.

Всегда профилируйте свой код на устройстве, используя базовую анимацию.

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