iphone - основной поток зависает на полсекунды ... почему? - PullRequest
0 голосов
/ 06 августа 2010

У меня есть приложение, которое рисует линии в контексте кварца.Приложение начинает рисовать, когда пользователь перемещает палец по экрану.

Во время срабатывания TouchesMoved я сохраняю кварцевый контекст в файл PNG (я знаю, что сохранение файла идет медленно ... Я пыталсячтобы сделать это с памятью, но использование памяти приложения резко возросло, поэтому я пытаюсь сделать это на диск).

Поскольку контекст сохраняется в этом, я делаю это при перемещениях

if (firstMove) // first movement after touchesbegan
  [NSThread detachNewThreadSelector:@selector(newThreadUNDO) 
     toTarget:self 
      withObject:nil];
  firstMove = NO
}

и затем у меня есть

- (void) newThreadUNDO {

  NSAutoreleasePool* p = [[NSAutoreleasePool alloc] init];

  [NSThread setThreadPriority:0.1];

  [NSThread sleepForTimeInterval:0.0];
  [self performSelectorOnMainThread:@selector(copyUNDOcontext) withObject:nil waitUntilDone:NO];

    [p release];
}

и

- (void) copyUNDOcontext {


  CGFloat w = board.image.size.width;
  CGFloat h = board.image.size.height;  
  CGRect superRect = CGRectMake(0,0, w, h);

  CGSize size = CGSizeMake(w, h);

  UIGraphicsBeginImageContext(size);
  CGContextRef new = UIGraphicsGetCurrentContext();
  // lineLayer is the layer context I need to save
  CGContextDrawLayerInRect(new, superRect, lineLayer);
  UIImage *imagem = UIGraphicsGetImageFromCurrentImageContext();

  [self saveTempImage:imagem :@"UNDO.png"]; 
  UIGraphicsEndImageContext();

}

Проблема в том, что, как только пользователь начинает двигаться, новый поток запускается, но даже этот новый поток становитсяс низким приоритетом основной поток все еще зависает примерно на полсекунды (возможно, пока файл сохраняется).

Почему это?

Как мне решить эту проблему?

спасибо.

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Вы пробовали:

 performSelector:onThread:withObject:waitUntilDone:

Если для параметра waitUntilDone установлено значение NO.

Если я не ошибаюсь, выполнение селектора в главном потоке всегда обрабатывает селектор в главном цикле выполнения приложения. Я могу ошибаться. Я использую GCD в течение некоторого времени.

Если вы попробуете это, я полагаю, вам нужно будет поместить пул автоматического выпуска в функцию, поскольку он будет служить точкой входа и выхода потока.

1 голос
/ 06 августа 2010

Во-первых, метод, названный как saveTempImage::, не рекомендуется.Сделайте это saveTempImage:fileName: или что-то еще.

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

Тем не менее, предположение, как правило, является непродуктивным способом анализа проблем с производительностью.Используйте предоставленные инструменты.Инструмент CPU Sampler может сказать вам, что на самом деле происходит.

Исправить?Сначала подтвердите проблему.Если это файловый ввод / вывод, удалите его из основного потока (я не изучал документацию UIImage, чтобы узнать, является ли он потокобезопасным в таком контексте).

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