Я пытаюсь улучшить производительность прокрутки в нашем приложении. Я следовал всем общепринятым советам (нарисуйте его сами с помощью CG, ячейка непрозрачна, не имеет никаких подзонов и т. Д.), Но она по-прежнему заикается, когда у нас есть фоновый процессор и сетевая активность.Использование CGLayer для ячеек кэша в UITableView
Одно из решений указано здесь:
http://www.fieryrobot.com/blog/2008/10/08/more-glassy-scrolling-with-uitableview/
является кэширование растровых снимков ячеек, которые мы пробовали. Но растровые изображения были нечеткими и занимали тонну памяти (~ несколько сотен kb каждый).
Одно из предложений в комментариях к этой ссылке - кешировать ячейки с помощью CGLayer или CALayer (?), Потому что они идут в память графической карты. Итак, несколько вопросов,
1) Пробовал ли это? Образец кода?
2) Сколько памяти имеет графическая карта для iphone/ipod touch? Есть ли в этом смысл?
3) Любые другие предложения по ускорению?
Более подробная информация
Я использовал сэмплер процессора (по телефону) и систематически уничтожал вещи из клетки, чтобы выяснить проблему. Несколько вещей:
1) Это не настройка ячейки. Если я удаляю только призывы рисования (drawinrect и т. Д.), Но оставьте настройку, она стекловидная.
2) Это не рисунок наименьшего изображения (25x25 png), если я положил его в это хорошо.
3) Если я добавляю второе или третье изображение (первый - большой фон 320x1004kB, другой - изображение кнопки 61x35 4kB), он заикается. Я захватываю оба UIImages в методе класса, поэтому он кэшируется.
4) Текст также является проблемой. Похоже, что drawRect тратит 75% своего времени в трех методах drawNRect NSString, которые я использую. Вроде:
[mytext drawInRect: drawrect withFont: myFont lineBreakMode: UILineBreakModeTailTruncation];
Эти вызовы, похоже, проходят через веб-сайт, возможно, это вызывает некоторые из заиканий? Мне нужно иметь возможность форматировать две строки текста и один небольшой абзац текста. Мне нужно усечь текст с эллипсами. Могу ли я выполнять их из критического пути и кэшировать их? Могу ли я сделать эту часть со слоем?
Я добавил дополнительную информацию в исходное сообщение, чтобы задать этот вопрос. Все-таки должен быть какой-то способ кэшировать ячейки в разумном объеме памяти? –
На самом деле решения, с которыми вы связаны, немного экстремальны, и большинство разработчиков iPhone используют основные механизмы повторного использования ячеек, оставляя чертеж на самом устройстве. Если бы вы могли опубликовать свой (разделенный) 'tableView: cellForRowAtIndexPath:', было бы полезно - мы должны начать с начала, прежде чем перейти к производительности рисования. –
Я использую метод повторного использования, проблема, похоже, не существует, поскольку я могу выполнить все повторное использование и настройку ячейки, но если я ничего не рисую, производительность будет прекрасной. Я фактически зашел так далеко, чтобы кэшировать ячейки самостоятельно, поэтому мне не нужно даже настраивать данные для них, но это не узкое место. –