проблемы с производительностью iPad - PullRequest
1 голос
/ 05 октября 2011

У меня проблема с производительностью моего приложения для iPad ..

Для разработки я использую MonoDevelop, который занимается сборкой мусора. Тем не менее, мои вопросы довольно общие, я бы сказал.

ОК, я использую TabBarController с 5 NavigationController. Внутри контроллеров навигации есть несколько контроллеров, чьи представления являются TableViews или ScrollViews. Следующий ребенок всегда просто обычный вид.

У меня есть несколько вопросов:

1) TableViews никогда не прокручиваются плавно. У меня есть некоторая альфа-прозрачность, но, поскольку я делал свою графику в Photoshop, а не программно, эта прозрачность не должна вызывать особых проблем. Неважно, есть ли у меня несколько или много результатов в таблице. С другой стороны, у меня есть ScrollView, который служит той же цели, то есть быть таблицей с другим макетом, а кнопки имеют прозрачность, созданную в Photoshop. Работает отлично.

Для таблиц я применил DequeueReusableCell(), который работает нормально (я вижу, что использование памяти не увеличивается после прокрутки). Так почему таблицы прокручиваются так резко?

2) Мое приложение поддерживает ротацию. Когда я прокручиваю таблицу или scrollView и одновременно немного наклоняю устройство, я получаю 1 или 2 FPS. Каков наилучший способ осуществления вращения? Как я понимаю, ShouldAutorotateToInterfaceOrientation должен быть переопределен во всех контроллерах в цепочке NavigationController. Кроме того, мне нужно добавить наблюдателя в View, я хочу, чтобы произошли некоторые изменения. Нужно ли использовать BeginGeneratingDeviceOrientationNotifications() во всех представлениях или достаточно сделать это в Main.cs? Может быть, это замедляет это?

3) Через некоторое время приложение начинает получать предупреждения о памяти, а затем в конечном итоге происходит сбой. Я пытался читать журналы и запускать приложение с помощью инструментов, но не могу найти причину сбоя.

4) Что именно происходит с представлением, извлеченным из стека NavigationController? Я не могу использовать это снова. Но может ли быть так, что Монотуш (или я) неправильно распорядился этим?

У меня почти такое же приложение для iPhone без поддержки вращения, которое никогда не падает. Я думаю, что я делаю что-то не так с этим вращением, но я не уверен, что.

Любая помощь будет оценена больше всего. Итак, заранее спасибо.

Привет

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

1 - прозрачные пленки - это всегда проблема.Даже если вы не визуализируете изображения в коде, телефон все равно должен выполнить компоновку изображения, а это может занять много времени.UITableViews должен вычислять окончательное составное изображение каждый раз, когда отображается новая ячейка или таблица прокручивается, тогда как UIScrollViews может вычислять только один раз, поскольку изображение не изменится.Поэтому будьте очень осторожны с этим, выключите прозрачность и проверьте, улучшается ли производительность.

2 - вам не нужно уведомлять каждый пользовательский интерфейс в вашем приложении.Получите уведомление в контроллерах, которые вы хотите обновить только, например, если вы хотите переставить элементы в представлении UIViewControllers.

3 - у вас одна (или много) утечка памяти.Я предполагаю, что MonoTouch, вероятно, не может собирать мусор UIViews или UIViewControllers, потому что они все еще связаны где-то в UIKit, как UINavigationController

4 - UIViews не удаляются UIKit, пока приложение не получит памятьпредупреждение

2 голосов
/ 06 октября 2011

Как сказал Эдуардо, альфа-прозрачность в Views имеет свою цену. Есть несколько инструментов, которые вы можете использовать для определения узких мест, обсуждаемых в этих выступлениях на WWDC 2011:

https://developer.apple.com/videos/wwdc/2011/

  • Производительность iOS и оптимизация питания с помощью инструментов
  • Понимание рендеринга UIKit

В меню «Отладка» симулятора iOS вы можете найти различные инструменты отладки, которые будут окрашивать различные области экрана, указывая, где происходит некоторая проблематичная отрисовка. Доклады WWDC 2011 показывают, что вы можете сделать, чтобы решить эти проблемы.

Что касается проблем с памятью, вполне вероятно, что у вас есть что-то, указывающее на окружающие ваши объекты, поэтому вам нужно убедиться, что эти объекты исчезли. Хотя в настоящее время мы не поставляем наш новый профилировщик для MonoTouch, который может показать источник проблемы, я написал утилиту отладки «бедняги», которая поможет вам определить, какие объекты живы. Это доступно здесь:

http://tirania.org/tmp/HttpDebug.cs

Вызовите HttpDebug.Start () из своего приложения и, когда вы запустите, подключитесь с помощью веб-браузера к http://localhost:5000, чтобы получить список живых объектов Objective C, всплывающих на C #. Инструмент не идеален и показывает много не относящихся к делу данных, но он, по крайней мере, даст вам представление о том, что происходит.

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